Ich habe eine iOS-App, die nicht auf diese Weise auf ios 5 abgestürzt ist, die jetzt beim Start nach 4 oder 5 bg / fg-Zyklen konsistent auf IOS 6 abstürzt. Ich habe das Problem auf meine Aufrufe von ALAssetsLibrary enumerateGroupsWithTypes zurückgeführt (die App synchronisiert sich bei jedem Start mit der zugrunde liegenden Fotobibliothek). Die Aufrufe von enumerateGroupsWithTypes erfolgen innerhalb eines Hintergrundthreads, der über die Dispatchwarteschlange aufgerufen wird, sodass der Synchronisierungscode auch dann beendet werden kann, wenn der Benutzer die App vor dem Beenden an das bg sendet. Die Fehlermeldung, die ich erhalte, ist immer dieselbe:
* Assertionsfehler in __addContextToList_block_invoke_0 (), /SourceCache/PhotoLibraryServices/MobileSlideShow-1647.5/Sources/PLManagedObjectContext.m:1305
und
* Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'Zu viele Kontexte. Kein Leerzeichen in contextList. '
Googeln für diese Fehlermeldungen hat nichts ergeben. Da dies nie passiert, bis die App mindestens fünf Mal ein- / ausgeschaltet wurde, denke ich, dass die Blöcke möglicherweise nicht korrekt aus den Apple-Datenstrukturen entfernt werden, wenn sie fertig sind? Vielen Dank im Voraus für alle Leads.
UPDATE: Nach weiteren Untersuchungen scheint dies mit der Synchronisierung von ALAsetsGroupLibrary zu tun zu haben. Der Absturz tritt nicht auf, wenn ich nur ALAsssetsGroupSavedPhotos synchronisiere oder wenn es in ALAsssetsGroupLibrary 0 Fotos gibt. Es wird auftreten, wenn ich nur ALAssetsGroupLibrary synchronisiere und mindestens ein Foto darin ist.
Es stellt sich heraus, dass dies alles damit zu tun hat, die ALAssetsLibrary für jede Synchronisation neu zuzuweisen. Wenn Sie stattdessen eine Membervariable hinzufügen, scheint der Absturz verschwunden zu sein.
assetsLibrary = [[ALAssesLibrary alloc] init];
Obwohl dies eindeutig ein effizienteres / besseres Design für meinen Code ist, würde ich sagen, dass die Probleme, die ich hatte, auf ein ARC-Problem mit ALAssentsLibrary und Threading hinweisen. Achten Sie darauf, nur einmal zuzuweisen!
Ich hatte das gleiche Problem:
Kurz gesagt: Während die Instanz ALAssetsLibrary
mit Typen auflistet oder die ALAssetsGroup
Instances im letzten Schritt Assets auflisten, sollten die Instanzen ALAssetsLibrary
und ALAssetsGroup
niemals geändert werden, bevor alle Aufzählungsblöcke vorhanden sind fertig.
ALAssetsLibrary-Enumeration wird im Hauptthread ausgeführt (siehe diese SO-Antwort ). Ich vermute, dass dies daran liegt, dass die Objektbibliothek möglicherweise mit dem Benutzer interagieren möchte, um Berechtigungen für die Verwendung von Standortdaten zu erhalten (da Fotos Geotags enthalten).
Dies kann die Ursache Ihres Problems sein, wenn Ihr Code davon ausgeht, dass ALAssentsLibrary weiterhin in einem Hintergrundthread ausgeführt wird.
Tags und Links ios alassetslibrary ios6