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

Antworten:

214

Sieht so aus, als wäre es einfach Thread.isMainThreadin Swift 3.

BalestraPatrick
quelle
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.

Brandon A.
quelle
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
Nik Kov
quelle
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)
Suhit Patil
quelle
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
}
Maxim Makhun
quelle