Как мне проверить, какой поток является текущим в Swift 3?
В предыдущих версиях Swift можно было проверить, является ли текущий поток основным, выполнив следующие действия:
NSThread.isMainThread()
Как мне проверить, какой поток является текущим в Swift 3?
В предыдущих версиях Swift можно было проверить, является ли текущий поток основным, выполнив следующие действия:
NSThread.isMainThread()
Ответы:
Похоже, это просто Thread.isMainThread
в Swift 3.
Thread.isMainThread
вернет логическое значение, указывающее, находитесь ли вы в настоящее время в основном потоке пользовательского интерфейса. Но это не даст вам текущий поток. Он только скажет вам, на главной вы или нет.
Thread.current
вернет текущий поток, в котором вы находитесь.
Я сделал расширение для печати потока и очереди:
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
Swift 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
См. Возвращает объект потока, представляющий текущий поток выполнения.
__dispatch_queue_get_label
не является частью Swift stdlib, он недоступен за пределами платформ Apple. Например, в Ubuntu это не назовешь.