web-dev-qa-db-fra.com

Qu'est-ce que le vérificateur de thread principal dans Xcode 9?

J'ai vérifié ce qu'il y a de neuf dans la documentation de Xcode 9, 

 enter image description here

Mais je ne comprenais pas comment utiliser ce nouveau Xcode 9

10
suthar

Il peut être activé/désactivé dans l'option de diagnostic du schéma ..___. De plus, l'option "Pause sur les problèmes" est une option pratique pour résoudre ces problèmes.

 Example

24
Saúl Moreno Abril

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.

16
deadbeef

Sous la section Vérification de l'API d'exécution, assurez-vous que le vérificateur de threads principal est activé pour voir si vous exécutez des méthodes d'interface utilisateur dans un thread autre que l'interface utilisateur 

 enter image description here

 enter image description here

0
Sh_Khan