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

Posted

技术标签:

【中文标题】有没有人在后台线程中使用 ALAssetsLibrary 时遇到过崩溃?【英文标题】:Has anyone experienced crashes when using ALAssetsLibrary in a background thread? 【发布时间】:2012-11-20 19:27:31 【问题描述】:

我有一个 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 张照片,就会发生这种情况。

【问题讨论】:

【参考方案1】:

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

assetsLibrary = [[ALAssetsLibrary alloc] init];

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

【讨论】:

【参考方案2】:

我遇到了同样的问题:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

您可以结帐。我之前遇到过这个问题。但是通过创建一个单例 ALAssetsLibrary 对象来解决它

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

【讨论】:

以上是关于有没有人在后台线程中使用 ALAssetsLibrary 时遇到过崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

没有主线程可以存在后台线程吗?

Asp.Net 中有没有办法与运行 Parallel.Foreach 的后台线程进行通信

java前台线程和后台线程

当计算使用后台线程时,如何正确声明计算属性?

在 NativeScript 中后台运行任务

如何中断AsyncTaskLoader后台线程?