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()
la source
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()
On dirait que c'est simplement Thread.isMainThread
dans Swift 3.
Thread.isMainThread
renverra 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.
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
Swift 4 et supérieur:
Thread.isMainThread
renvoie 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 / 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)
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
}
Dans la dernière version de Swift 4.0 ~ 4.2, nous pouvons utiliser Thread.current
Voir Renvoie l'objet thread représentant le thread d'exécution actuel