Unter dem Runtime API Abschnitt prüfen, stellen Sie sicher, dass der Haupt Thread Checker aktiviert ist, um zu sehen, ob Sie ui Methoden ausgeführt wird in einem nicht-UI-Thread
Von der Apple-Dokumentation :
Der Haupt-Thread-Checker ist ein eigenständiges Tool für Swift- und C-Sprachen entdeckt ungültige Verwendung von AppKit, UIKit und anderen APIs auf a Hintergrundfaden. Aktualisieren der Benutzeroberfläche für einen anderen Thread als den Hauptthread ist ein häufiger Fehler, der zu verpassten visuellen UI-Updates führen kann Defekte, Datenbeschädigungen und Abstürze.
Also zum Beispiel versuchen, die Eigenschaft text
eines UILabel
auf einem Hintergrund zu ändern
Thread wird nicht funktionieren. Apple sagt, dass dies zu verpassten UI-Updates, visuellen Fehlern, Datenbeschädigungen und Abstürzen führen kann . In der Praxis führt dies in 99% der Fälle zu zufälligen verpassten UI-Updates und visuellen Fehlern (und nicht zu Abstürzen).
Crashes wären eigentlich gut, weil wir solche unsachgemäße Verwendung von UIKit
leicht erkennen 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.
Der Haupt-Thread-Checker hilft , die Verwendung von UIKit
in einem Hintergrundthread zu erkennen, löst sie nicht . Sobald Sie eine Verwendung von UIKit
in einem Hintergrund-Thread entdeckt haben, können Sie ihn mit DispatchQueue
lösen.
Nochmals von Apple-Dokumentation :
Die Dokumentation von URLSession
sagt, dass die Beendigung der Schließung in einem Hintergrundthread aufgerufen wird. Das ist also schlecht. Der Main Thread Checker wird Ihnen helfen, die Verwendung von UIKit in einem Hintergrundthread zu erkennen.
Lösung: Verwenden Sie DispatchQueue.main
, um UI-Updates für den Hauptthread durchzuführen.
Die Lösung selbst hat nichts mit Xcode zu tun, es ist ein Merkmal der Sprache. So war es natürlich in früheren Versionen von Xcode möglich, aber vor Xcode 9 hatten Sie nicht den Haupt-Thread-Checker, um das Problem zu erkennen.
Wie @hamish darauf hinweist, können Sie auch das WWDC-Video für eine ausführlichere Erklärung ansehen .