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()
BalestraPatrick
la source

Réponses:

215

On dirait que c'est simplement Thread.isMainThreaddans Swift 3.

BalestraPatrick
la source
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.

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