Wie überprüfe ich, welcher der aktuelle Thread in Swift 3 ist?
In früheren Versionen von Swift konnte auf folgende Weise überprüft werden, ob der aktuelle Thread der Haupt-Thread war:
NSThread.isMainThread()
quelle
Wie überprüfe ich, welcher der aktuelle Thread in Swift 3 ist?
In früheren Versionen von Swift konnte auf folgende Weise überprüft werden, ob der aktuelle Thread der Haupt-Thread war:
NSThread.isMainThread()
Sieht so aus, als wäre es einfach Thread.isMainThread
in Swift 3.
Thread.isMainThread
gibt einen Booleschen Wert zurück, der angibt, ob Sie sich derzeit im Haupt-UI-Thread befinden. Dies gibt Ihnen jedoch nicht den aktuellen Thread. Es wird Ihnen nur sagen, ob Sie an der Hauptleitung sind oder nicht.
Thread.current
gibt den aktuellen Thread zurück, in dem Sie sich befinden.
Ich habe eine Erweiterung zum Drucken des Threads und der Warteschlange erstellt:
extension Thread {
class func printCurrent() {
print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
}
}
Thread.printCurrent()
Das Ergebnis wäre:
⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Swift 4 und höher:
Thread.isMainThread
Gibt zurück Bool
, dass diese Erweiterung hilfreich ist, wenn sich der Benutzer im Haupt-Thread befindet oder nicht, falls jemand den Namen der Warteschlange / des Threads drucken möchte
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
}
}
}
Wie benutzt man:
print(Thread.current.threadName)
Bei Verwendung von GCD können Sie dispatchPrecondition verwenden , um eine Versandbedingung zu überprüfen, die für die weitere Ausführung erforderlich ist. Dies kann nützlich sein, wenn Sie die Ausführung Ihres Codes auf dem richtigen Thread gewährleisten möchten. Beispielsweise:
DispatchQueue.main.async {
dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
In den neuesten Swift 4.0 ~ 4.2 können wir verwenden Thread.current
Siehe Gibt das Thread-Objekt zurück, das den aktuellen Ausführungsthread darstellt