Як перевірити, яка з них є поточною ниткою в Swift 3?
У попередніх версіях Swift можна було перевірити, чи поточна нитка була основною, виконавши це:
NSThread.isMainThread()
Як перевірити, яка з них є поточною ниткою в Swift 3?
У попередніх версіях Swift можна було перевірити, чи поточна нитка була основною, виконавши це:
NSThread.isMainThread()
Відповіді:
Схоже, це просто Thread.isMainThread
у Swift 3.
Я зробив розширення для друку нитки та черги:
extension Thread {
class func printCurrent() {
print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
}
}
Thread.printCurrent()
Результатом буде:
⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Швидкий рух 4 і вище:
Thread.isMainThread
повертає, Bool
заявляючи, що якщо користувач перебуває на головній темі чи ні, у випадку, якщо хтось хоче надрукувати ім'я черги / нитки, це розширення буде корисним
extension Thread {
var threadName: String {
if let currentOperationQueue = OperationQueue.current?.name {
return "OperationQueue: \(currentOperationQueue)"
} else if let underlyingDispatchQueue = OperationQueue.current?.underlyingQueue?.label {
return "DispatchQueue: \(underlyingDispatchQueue)"
} else {
let name = __dispatch_queue_get_label(nil)
return String(cString: name, encoding: .utf8) ?? Thread.current.description
}
}
}
Як використовувати:
print(Thread.current.threadName)
Під час використання GCD ви можете використовувати dispatchPrecondition, щоб перевірити умови відправки, необхідні для подальшого виконання. Це може бути корисно, якщо ви хочете гарантувати виконання коду на правильній темі. Наприклад:
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
В останній версії Swift 4.0 ~ 4.2 ми можемо використовувати Thread.current
Див. Повернення об'єкта потоку, що представляє поточний потік виконання