Hat jemand bei der Verwendung von ALAssetsLibrary in einem Hintergrund-Thread Abstürze erlebt?

8

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.

    
Jeremy Robin 20.11.2012, 19:27
quelle

4 Antworten

7

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!

    
Jeremy Robin 21.11.2012, 17:29
quelle
1

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.

    
Feng 29.11.2012 08:06
quelle
0

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.

    
mblackwell8 10.12.2012 03:59
quelle
0

Sie können dies auschecken. Ich habe dieses Problem vorher. Aber beheben Sie es, indem Sie ein Singleton ALAssentsLibrary-Objekt

erstellen

Ссылка

    
NSKevin 21.09.2015 10:45
quelle

Tags und Links