¿Cómo verificar el hilo actual en Swift 3?

105

¿Cómo verifico cuál es el hilo actual en Swift 3?

En versiones anteriores de Swift era posible verificar si el hilo actual era el principal haciendo esto:

NSThread.isMainThread()
BalestraPatrick
fuente

Respuestas:

214

Parece que está simplemente Thread.isMainThreaden Swift 3.

BalestraPatrick
fuente
106

Thread.isMainThreaddevolverá un booleano que indica si se encuentra actualmente en el hilo principal de la interfaz de usuario. Pero esto no le dará el hilo actual. Solo te dirá si estás en la red principal o no.

Thread.current devolverá el hilo actual en el que se encuentra.

Brandon A
fuente
24

Hice una extensión para imprimir el hilo y la cola:

extension Thread {
    class func printCurrent() {
        print("\r⚡️: \(Thread.current)\r" + "🏭: \(OperationQueue.current?.underlyingQueue?.label ?? "None")\r")
    }
}

Thread.printCurrent()

El resultado sería:

⚡️: <NSThread: 0x604000074380>{number = 1, name = main}
🏭: com.apple.main-thread
Nik Kov
fuente
17

Swift 4 y superior:

Thread.isMainThreaddevuelve Boolindicando que si el usuario está en el hilo principal o no, en caso de que alguien quiera imprimir el nombre de la cola / hilo, esta extensión será útil

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
        }
    }
}

Cómo utilizar:

print(Thread.current.threadName)
Suhit Patil
fuente
9

Al usar GCD, puede usar dispatchPrecondition para verificar una condición de envío necesaria para su posterior ejecución. Esto puede ser útil si desea garantizar la ejecución de su código en el hilo correcto. Por ejemplo:

DispatchQueue.main.async {
    dispatchPrecondition(condition: .onQueue(DispatchQueue.global())) // will assert because we're executing code on main thread
}
Maxim Makhun
fuente