在后台线程中使用ALAssetsLibrary时是否有人遇到过崩溃?

时间:2012-11-20 19:27:31

标签: ios ios6 alassetslibrary

我有一个ios应用程序,它没有以这种方式在ios 5上崩溃,现在在4或5 bg / fg周期后在启动时在ios 6上始终崩溃。我已经将问题跟踪到ALAssetsLibrary enumerateGroupsWithTypes的调用(应用程序启动时会同步到底层照片库)。对enumerateGroupsWithTypes的调用是在通过调度队列调用的后台线程中进行的,这样即使用户在完成之前将应用程序发送到bg,同步代码也可以完成。我收到的崩溃消息总是一样的:

* __addContextToList_block_invoke_0()中的断言失败,/ SourceCache / PhotoLibraryServices / MobileSlideShow-1647.5 / Sources / PLManagedObjectContext.m:1305

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'太多的上下文。 contextList中没有空格。'

Google搜索这些错误消息并没有产生任何结果。因为在应用程序开启/关闭至少5次之前,这种情况永远不会发生,我想这些块在完成后可能没有正确地从苹果数据结构中删除?提前感谢任何线索。

更新: 经过更多研究后,这似乎与同步ALAssetsGroupLibrary有关。当我只同步ALAssetsGroupSavedPhotos或ALAssetsGroupLibrary中有0张照片时,不会发生崩溃。如果我只同步ALAssetsGroupLibrary并且其中至少有一张照片,则会发生这种情况。

4 个答案:

答案 0 :(得分:7)

事实证明,这与为每个同步重新分配ALAssetsLibrary有关。 通过添加成员变量,崩溃似乎已经消失。

assetsLibrary = [[ALAssetsLibrary alloc] init];

虽然这对我的代码来说显然是一种更有效/更好的设计,但我会说我遇到的问题表明ALAssetsLibrary和线程存在一些ARC问题。确保只分配一次!

答案 1 :(得分:1)

我遇到了同样的问题:

简而言之:虽然ALAssetsLibrary实例使用类型进行枚举,但枚举最后一步的ALAssetsGroup实例枚举资产,ALAssetsLibrary实例和ALAssetsGroup实例应该永远不会在所有枚举块完成之前已经更改。

答案 2 :(得分:0)

ALAssetsLibrary枚举在主线程中运行(请参阅this SO answer)。我怀疑这是因为资产库可能希望与用户交互以获得使用位置数据的权限(因为照片具有地理标记)。

如果您的代码假定ALAssetsLibrary将继续在后台线程中运行,那么这可能是您的问题的根源。

答案 3 :(得分:0)

你可以结帐。我以前遇到过这个问题。但是通过创建一个单独的ALAssetsLibrary对象来修复它

https://stackoverflow.com/a/32693118/3103450