Ich habe vor 2 Jahren eine riesige iPad App geschrieben und jetzt komme ich zurück und aktualisiere sie auf iOS5. Es ist ein bisschen unordentlich, da es meine erste große iPad App war.Tipps zum zeitweiligen Einfrieren der iOS UI
Es hat einen "Sync" -Schritt, der für einige Minuten dauern kann und das sind eine Reihe von asynchronen Methodenaufrufen, die JSON von einer URL holen und sie in Kerndaten ablegen. Ziemlich oft wird die App einfrieren (UI reagiert nicht mehr).
Was sind einige gute Techniken, um diesen Einfrieren aufzuspüren? Der Debugger ist nicht so hilfreich, es sei denn, der Code läuft im Hauptthread, Sie haben keinen verwendbaren Stack-Trace. Die App wird oft auch nicht wiederhergestellt, was auf eine Art Deadlock-Situation hindeutet.
Hier ist ein besonderes Beispiel, die helfen könnten:
Ich hielt inne, die Ausführung, sobald ich, dass es überprüft wurde eingefroren. Es scheint jedes Mal in der gleichen Zeile einzufrieren - eine einfache Aufgabe. Was geht hier vor sich? Es ist so frustrierend.
Ist dieser Kern Datenzugriff, der dies verursacht? Alle Hinweise würden sehr geschätzt werden.
EDIT 29-Juni-2012
Click here die Quelle der Klasse zu sehen, die alle FÜHRT/Update/Löschen von Objekten Kerndaten. Ich muss nur das Einfrieren/Absturz in dieser App stoppen. Ich weiß, es ist ein Durcheinander, es bringt mich auch zusammen. Ich schrieb dies vor 2 Jahren mit kaum Wissen von Ziel-c. Ich sollte es neu schreiben, aber ich muss das in zwei Tagen funktionieren lassen. Könnte mir jemand Hinweise auf Ansätze geben, um diese Thread-safe schnell zu bekommen? Könnte ich jede Methode, die NSManagedObjectContext im zentralen Code des zentralen Dispatchblocks aktualisiert, umbrechen?
Wenn die Benutzeroberfläche nicht mehr reagiert, geschieht dies, weil Sie Code im Hauptthread ausführen, der im Hintergrund ausgeführt werden soll. Sie können versuchen, die App während dieses Einfrierens anzuhalten und hoffentlich einen nützlichen Stack-Trace auf dem Hauptthread zu erhalten ... aber Sie werden es wahrscheinlich nicht tun. Der einzige Weg, den ich in diesem Szenario als sehr hilfreich empfunden habe, ist, den Code, den du ausführst, und wo genau zu kritisieren. Überprüfen Sie alle Ihre Webanfragen und den zugehörigen Code sowie andere Bereiche, die Ihrer Meinung nach prozessintensiv sind. – Matt
Eine andere Idee (anstatt im Debugger zu pausieren und auf das Beste zu hoffen) könnte sein, die App unter Instrumente laufen zu lassen, die Ihnen sagen wird, welche Methoden am meisten Zeit verbrauchen. Ich habe es sehr hilfreich gefunden, genau diese Probleme zu beheben. –
Ich aktualisierte Frage mit Link zur Quelle - wenn das hilft. –