Ich habe die Neuerungen in der Xcode 9-Dokumentation überprüft. Ich finde das
Aber ich habe nicht verstanden, wie ich das mit dem neuen Xcode 9 verwenden kann
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.