Comment vérifier quel est le thread actuel dans Swift 3?
Dans les versions précédentes de Swift, il était possible de vérifier si le thread actuel était le thread principal en procédant comme suit:
NSThread.isMainThread()
On dirait que c'est simplement Thread.isMainThread
dans Swift 3.
Thread.isMainThread
retournera un booléen indiquant si vous êtes actuellement sur le fil principal de l'interface utilisateur. Mais cela ne vous donnera pas le fil de discussion actuel. Il ne vous dira que si vous êtes sur le principal ou non.
Thread.current
retournera le fil actuel sur lequel vous vous trouvez.
J'ai créé 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
Swift 4 et plus:
Thread.isMainThread
retourne Bool
indiquant 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/fil, cette extension serait 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)
Dans les dernières Swift 4.0 ~ 4.2, nous pouvons utiliser Thread.current
See Retourne l'objet thread représentant le thread en cours d'exécution
Lorsque vous utilisez GCD, vous pouvez utiliser dispatchPrecondition pour vérifier une condition d’expédition nécessaire à une exécution ultérieure. Cela peut être utile si vous voulez 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
}