【问题标题】:Trouble Reproducing CoreData 'could not fulfill a fault' Crash无法重现 CoreData“无法完成故障”崩溃
【发布时间】:2014-12-04 23:37:43
【问题描述】:

我认为这是一个有点典型的问题,我在后台线程上删除和更新 CoreData 数据,而 UITableView 正在呈现以前获取的 CoreData 对象数组,我收到:

"NSObjectInaccessibleException CoreData could not fulfill a fault for"

我已经阅读了很多关于如何修复它的建议,但在我盲目地添加代码之前,我想先重现这个问题。

对于我的测试用例,我有三个步骤。

  1. 从 CoreData 获取项目
  2. 创建后台线程。在新线程中创建长循环(可能是 100 次迭代),其中数据库被擦除并重新加载,就像在崩溃中一样。后台线程创建一个新的 NSManagedObjectContext 但与主上下文共享 PersistantStore。
  3. 将主 UI 线程发送到无限循环(>10,000 次迭代),不断从主上下文中获取新项目,然后迭代获取的对象。我也尝试过这个测试,只需遍历原始获取对象列表而不重新获取。

我希望这个测试用例会导致 NSObjectInaccessibleException 错误,但一切正常,我无法重现崩溃。在查看我的代码和无法重现此错误之间,我觉得我做的一切都是正确的。然而,不知何故,这种崩溃出现了。

关于如何重现此崩溃的任何想法?

【问题讨论】:

    标签: ios objective-c multithreading core-data


    【解决方案1】:
    1. 似乎在后台保存上下文但等待主线程与主上下文合并或在合并过程中时发生这种情况。因此,请尝试在主线程中并行添加更多内容,以增加保存和合并之间的时间。
    2. 在 Crashlytics 中,我们也遇到了这个问题(前 1 个),而且几乎总是发生在 [NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] 的私有方法中。 (这一行在日志的中间......)。所以尝试添加/删除与 TableView+ NSFetchedResultsController 关联的对象。 + 更多 reloadData 在这里。

    【讨论】:

    • 好主意。我将尝试将正在保存的记录数量大幅增加至少一个因素。
    • 我已经添加了多达 100,000 条要删除和保存的记录,同时我同时重新加载了包含原始数据的 UITableVIew。我似乎无法重现这次崩溃,但它仍然出现在 Crashlytics 中。
    猜你喜欢
    • 2012-08-07
    • 2014-11-21
    • 2011-08-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多