Comment vérifier le fil actuel dans Swift 3?


105

Comment vérifier quel est le fil de discussion actuel dans Swift 3?

Dans les versions précédentes de Swift, il était possible de vérifier si le thread actuel était le principal en faisant ceci:

NSThread.isMainThread()

Réponses:



106

Thread.isMainThreadrenverra un booléen indiquant si vous êtes actuellement sur le thread d'interface utilisateur principal. Mais cela ne vous donnera pas le fil actuel. Il ne vous dira que si vous êtes sur le réseau principal ou non.

Thread.current renverra le thread actuel sur lequel vous êtes.


24

J'ai fait une extension pour imprimer le fil et la file d'attente:

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

Thread.printCurrent()

Le résultat serait:

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

17

Swift 4 et supérieur:

Thread.isMainThreadrenvoie Boolindiquant que si l'utilisateur est sur le fil principal ou non, au cas où quelqu'un voudrait imprimer le nom de la file d'attente / du fil, cette extension sera 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
        }
    }
}

Comment utiliser:

print(Thread.current.threadName)

9

Lorsque vous utilisez GCD, vous pouvez utiliser dispatchPrecondition pour vérifier une condition d'expédition nécessaire pour une exécution ultérieure. Cela peut être utile si vous souhaitez garantir l'exécution de votre code sur le bon thread. Par exemple:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.