NSObjectInaccessibleException',原因:'CoreData无法完成故障

问题描述 投票:8回答:5

我的iOS应用通过多个​​线程使用核心数据。我收到一些崩溃报告,并显示以下消息:“'NSObjectInaccessibleException',原因:'CoreData无法满足'0x1e07a9b0的错误”

我了解导致此问题的原因-该对象已删除,但另一个线程正在尝试访问它。我正在努力解决问题,但我想在后台线程中添加检查以查看对象是否会以这种方式发生故障。

此刻我的代码与myObject.myValue有关。是否可以做一些检查,例如:

if (!myObject.myValue) {
    return;
}

...,以便在执行任何可能导致此类崩溃的操作之前退出方法?还是会简单地调用myObject.myValue,即使它是否为空,也会引发此类异常?

ios multithreading core-data crash nsmanagedobject
5个回答
19
投票

您可以尝试使用existingObjectWithID:error:

返回指定ID的对象。

existingObjectWithID:error:

讨论

如果上下文中已经注册了具有给定ID的托管对象,则直接返回该对象;否则,相应的对象将被错误地放入上下文。

如果未缓存数据,此方法可能会执行I / O。

与objectWithID:不同,此方法永远不会返回错误。

您可以这样做:

   - (NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID error:(NSError **)error

5
投票

如果遇到在另一个线程上可能删除该对象的问题,则应在访问该对象的变量之前验证该对象是否存在。

两种方法:

  1. 无论何时删除数据,都要刷新视图数据源。您可以通过注册if ([myMOC existingObjectWithID:myObject.objectID error:&error]) ... 通知,然后解析该通知上的NSManagedObjectContextObjectsDidChangeNotification来查看删除了哪个对象。]
  2. [将数据传递到多个线程时,使用与下面类似的代码。
  3. 示例:

userInfo

2
投票

您可以在使用NSManagedObject时检查NSManagedContext是否存在。像这样:


0
投票

您可以检查if (obj.managedObjectContext) { //do things } ,其中[myObject isFault]myObject实例


0
投票

您可以尝试使用:

© www.soinside.com 2019 - 2024. All rights reserved.