Как проверить, какой из них является текущим потоком в 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)
В последней Thread.current
Swift 4.0 ~ 4.2 мы можем использовать Thread.current
См. Возвращает объект потока, представляющий текущий поток выполнения.
При использовании GCD вы можете использовать dispatchPrecondition для проверки условия отправки, необходимого для дальнейшего выполнения. Это может быть полезно, если вы хотите гарантировать выполнение вашего кода в правильном потоке. Например:
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}