Come controllare il thread corrente in Swift 3?


105

Come posso verificare qual è il thread corrente in Swift 3?

Nelle versioni precedenti di Swift era possibile verificare se il thread corrente fosse quello principale in questo modo:

NSThread.isMainThread()

Risposte:



106

Thread.isMainThreadrestituirà un valore booleano che indica se sei attualmente nel thread principale dell'interfaccia utente. Ma questo non ti darà il thread corrente. Ti dirà solo se sei sul principale o no.

Thread.current restituirà il thread corrente in cui ti trovi.


24

Ho creato un'estensione per stampare il thread e la coda:

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

Thread.printCurrent()

Il risultato sarebbe:

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

17

Swift 4 e versioni successive:

Thread.isMainThreadrestituisce Boolaffermando che se l'utente è su Main Thread o No, nel caso in cui qualcuno volesse stampare il nome della coda / thread questa estensione sarà utile

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

Come usare:

print(Thread.current.threadName)

9

Quando si utilizza GCD è possibile utilizzare dispatchPrecondition per verificare una condizione di invio necessaria per un'ulteriore esecuzione. Questo può essere utile se vuoi garantire l'esecuzione del codice sul thread corretto. Per esempio:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.