Jak sprawdzić, który z nich jest bieżącym wątkiem w Swift 3?
W poprzednich wersjach Swifta można było sprawdzić, czy bieżący wątek jest głównym wątkiem, wykonując następujące czynności:
NSThread.isMainThread()
Jak sprawdzić, który z nich jest bieżącym wątkiem w Swift 3?
W poprzednich wersjach Swifta można było sprawdzić, czy bieżący wątek jest głównym wątkiem, wykonując następujące czynności:
NSThread.isMainThread()
Odpowiedzi:
Wygląda na to, że jest po prostu Thread.isMainThread
w Swift 3.
Thread.isMainThread
zwróci wartość logiczną wskazującą, czy aktualnie znajdujesz się w głównym wątku interfejsu użytkownika. Ale to nie da ci aktualnego wątku. Powie ci tylko, czy jesteś na głównym, czy nie.
Thread.current
zwróci bieżący wątek, w którym się znajdujesz.
Zrobiłem rozszerzenie do drukowania wątku i kolejki:
extension Thread {
class func printCurrent() {
print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
}
}
Thread.printCurrent()
Wynik byłby taki:
⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Swift 4 i nowsze:
Thread.isMainThread
zwraca z informacją Bool
, że jeśli użytkownik jest w wątku głównym lub nie, w przypadku, gdy ktoś chce wydrukować nazwę kolejki / wątku to rozszerzenie będzie pomocne
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
}
}
}
Jak używać:
print(Thread.current.threadName)
Korzystając z GCD, możesz użyć metody dispatchPrecondition, aby sprawdzić warunek wysyłki niezbędny do dalszego wykonania. Może to być przydatne, jeśli chcesz zagwarantować wykonanie kodu we właściwym wątku. Na przykład:
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
W najnowszym Swift 4.0 ~ 4.2 możemy użyć Thread.current
Zobacz Zwraca obiekt wątku reprezentujący bieżący wątek wykonywania