Wie überprüfe ich den aktuellen Thread in Swift 3?


105

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()

Antworten:



106

Thread.isMainThreadgibt 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.


24

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

15

Swift 4 und höher:

Thread.isMainThreadGibt 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)

9

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
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.