webentwicklung-frage-antwort-db.com.de

Was ist der Haupt-Thread-Checker in Xcode 9?

Ich habe die Neuerungen in der Xcode 9-Dokumentation überprüft. Ich finde das 

 enter image description here

Aber ich habe nicht verstanden, wie ich das mit dem neuen Xcode 9 verwenden kann

10
suthar

Sie kann in der Diagnoseoption des Schemas aktiviert/deaktiviert werden. Außerdem ist die "Pause bei Problemen" eine komfortable Option, um diese Probleme zu beheben.

 Example

24

Aus Apple-Dokumentation :

Der Haupt-Thread-Checker ist ein eigenständiges Werkzeug für die Sprachen Swift und C die eine ungültige Verwendung von AppKit, UIKit und anderen APIs auf einer .__ erkennt. Hintergrund-Thread. Aktualisieren der Benutzeroberfläche in einem anderen Thread als dem Hauptthread ist ein häufiger Fehler, der zu verpassten UI-Aktualisierungen führen kann, visual Defekte, Datenverfälschungen und Abstürze.

Wenn Sie zum Beispiel versuchen, die text-Eigenschaft einer UILabel in einem Hintergrund -Thread zu ändern, wird dies nicht funktionieren. Apple sagt, dass dies dazu führen kann, dass Aktualisierungen der Benutzeroberfläche, visuelle Defekte, Datenverfälschungen und Abstürze verpasst werden. In der Praxis führt dies in 99% der Fälle zu random verpassten UI-Aktualisierungen und visuellen Fehlern (und nicht zu Abstürzen).

Abstürze wären eigentlich gut, weil wir eine solche unsachgemäße Verwendung von UIKit leicht feststellen könnten, aber zufällige visuelle Defekte sind während der Entwicklung viel schwieriger zu erkennen. Und hier kommt der Main Thread Checker ins Spiel.

Die Haupt-Thread-Überprüfung hilft dectect bei der Verwendung von UIKit in einem Hintergrund-Thread, löst sie nicht. Wenn Sie festgestellt haben, dass UIKit in einem Hintergrund-Thread verwendet wurde, können Sie es mit DispatchQueue lösen.

Wieder aus Apple-Dokumentation :

Die Dokumentation von URLSession besagt, dass der Abschlussabschluss für einen Hintergrundthread aufgerufen wird. Das ist also schlecht. Mit der Haupt-Thread-Überprüfung können Sie die Verwendung von UIKit in einem Hintergrundthread erkennen.

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()

Lösung: Verwenden Sie DispatchQueue.main, um Aktualisierungen der Benutzeroberfläche im Hauptthread durchzuführen.

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()

Die Lösung selbst hat nichts mit Xcode zu tun, sie ist eine Funktion der Sprache. Natürlich war es in früheren Xcode-Versionen möglich, aber vor Xcode 9 hatten Sie keinen Main Thread Checker, um das Problem zu erkennen.

Wie @hamish hervorhebt, können Sie das WWDC-Video für eine ausführlichere Erklärung ansehen.

16
deadbeef

Stellen Sie im Abschnitt Laufzeit-API-Überprüfung sicher, dass Main Thread Checker aktiviert ist, um festzustellen, ob Sie UI-Methoden in einem Nicht-UI-Thread ausführen 

 enter image description here

 enter image description here

0
Sh_Khan