8

我有一个 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 中没有空格。

谷歌搜索这些错误消息并没有产生任何结果。由于在应用程序至少循环打开/关闭 5 次之前不会发生这种情况,我想也许这些块在完成时没有从苹果数据结构中正确删除?提前感谢任何线索。

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

4

4 回答 4

7

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

assetsLibrary = [[ALAssetsLibrary alloc] init];

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

于 2012-11-21T17:29:29.293 回答
1

我遇到了同样的问题:

简而言之:当ALAssetsLibrary实例枚举类型或ALAssetsGroup上一步枚举的实例正在枚举资产时,在所有枚举块完成之前,不应更改ALAssetsLibrary实例和实例。ALAssetsGroup

于 2012-11-29T08:06:24.760 回答
0

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

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

于 2012-12-10T03:59:41.973 回答
0

你可以签出这个。我以前有这个问题。但是通过创建一个单例 ALAssetsLibrary 对象来解决它

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

于 2015-09-21T10:45:02.550 回答