Como verificar o tópico atual no Swift 3?

105

Como posso verificar qual é o tópico atual no Swift 3?

Nas versões anteriores do Swift, era possível verificar se o tópico atual era o principal fazendo o seguinte:

NSThread.isMainThread()
BalestraPatrick
fonte

Respostas:

214

Parece que está simplesmente Thread.isMainThreadno Swift 3.

BalestraPatrick
fonte
106

Thread.isMainThreadretornará um booleano indicando se você está atualmente no thread de interface do usuário principal. Mas isso não lhe dará o tópico atual. Ele só vai dizer se você está na linha principal ou não.

Thread.current retornará o tópico atual em que você está.

Brandon A
fonte
24

Fiz uma extensão para imprimir o thread e a fila:

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

Thread.printCurrent()

O resultado seria:

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

Swift 4 e superior:

Thread.isMainThreadretorna Boolinformando que se o usuário está no thread principal ou não, no caso de alguém querer imprimir o nome da fila / thread esta extensão 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
        }
    }
}

Como usar:

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

Ao usar o GCD, você pode usar dispatchPrecondition para verificar uma condição de envio necessária para execução posterior. Isso pode ser útil se você quiser garantir a execução do código no thread correto. Por exemplo:

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