J'ai vérifié ce qu'il y a de neuf dans la documentation de Xcode 9,
Mais je ne comprenais pas comment utiliser ce nouveau Xcode 9
De Documentation Apple :
Le vérificateur de threads principal est un outil autonome pour les langages Swift et C. qui détecte l'utilisation non valide de AppKit, UIKit et d'autres API sur un fichier fil de fond. Mise à jour de l'interface utilisateur sur un thread autre que le thread principal est une erreur commune qui peut entraîner des mises à jour manquantes de l'interface utilisateur, visuel défauts, corruptions de données et accidents.
Ainsi, par exemple, essayer de modifier la propriété text
d'un UILabel
sur un thread en arrière-plan Ne fonctionnera pas. Apple indique que cela peut entraîner mises à jour manquantes de l'interface utilisateur, défauts visuels, corruption de données et blocages. En pratique, cela entraînera dans random des mises à jour manquantes de l'interface utilisateur et des défauts visuels (et non des plantages) dans 99% des cas.
Les collisions seraient en fait une bonne chose, car nous pourrions détecter facilement une telle utilisation impropre de UIKit
, mais les défauts visuels aléatoires sont beaucoup plus difficiles à détecter pendant le développement. Et c’est là que le vérificateur de fil principal entre en jeu.
Le Vérificateur de thread principal aidera dectect à utiliser UIKit
sur un thread d'arrière-plan, il ne les résoudra pas. Une fois que vous avez détecté une utilisation de UIKit
sur un fil d’arrière-plan, vous pouvez le résoudre en utilisant DispatchQueue
.
Encore une fois, à partir de documentation Apple :
La documentation de URLSession
indique que la clôture de l'achèvement sera appelée sur un thread en arrière-plan. Le vérificateur de thread principal vous aidera donc à détecter l'utilisation de UIKit sur un thread en arrière-plan.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
self.label.text = "\(data.count) bytes downloaded"
// Error: label updated on background thread
}
}
task.resume()
Solution: Utilisez DispatchQueue.main
pour effectuer les mises à jour de l'interface utilisateur sur le thread principal.
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
DispatchQueue.main.async { // Correct
self.label.text = "\(data.count) bytes downloaded"
}
}
}
task.resume()
La solution elle-même n'a rien à voir avec Xcode, c'est une fonctionnalité du langage. Cela était donc évidemment possible dans les versions précédentes de Xcode, mais avant Xcode 9, vous ne disposiez pas du Vérificateur de thread principal pour vous aider à détecter le problème.
Comme @hamish le souligne, vous pouvez également regarder la vidéo de WWDC pour une explication plus détaillée.