NSObjectInaccessibleException',原因:'CoreData不能履行一个错误

我的iOS应用程序通过多个线程使用核心数据。 我得到一些崩溃报告,并带有以下消息:“'NSObjectInaccessibleException',原因:'CoreData无法履行'0x1e07a9b0'的错误

我明白是什么导致这个问题 – 对象被删除,但另一个线程试图访问它。 我正在努力解决这个问题,但我想在后台线程添加一个检查,看看对象是否会以这种方式错误。

我目前的代码与myObject.myValue 。 是否可以做一些检查,如:

 if (!myObject.myValue) { return; } 

…在做任何可能导致这样的崩溃的事情之前,它会摆脱这种方法? 或者只是简单地调用myObject.myValue ,甚至看它是否为空,导致这样的exception被抛出?

你可以尝试使用existingObjectWithID:error: ::

返回指定ID的对象。

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

讨论

如果有一个已经在上下文中注册了给定ID的被pipe理对象,则该对象被直接返回; 否则相应的对象将被错误地join到上下文中。

如果数据未被高速caching,则此方法可能会执行I / O。

与objectWithID不同,此方法从不返回错误。

你可以这样做:

 if ([myMOC existingObjectWithID:myObject.objectID error:&error]) ... 

如果您遇到可能会在另一个线程上删除该对象的问题,则应该在访问它的variables之前validation该对象是否存在。

两种方法:

  1. 只要您的数据被删除,刷新视图数据源。 您可以通过注册NSManagedObjectContextObjectsDidChangeNotification通知,然后parsing该通知上的userInfo来查看哪个对象被删除。
  2. 在将数据传递给多个线程时,请使用类似于下面的代码。

例:

 // Cache and pass the object's ID off to another thread to do work on // You can just store it as a property on the class @try { NSManagedObject *theObject = [managedObjectContext objectWithID:self.theObjectID]; // do stuff with object } @catch (NSException * e) { // An entity with that object ID could not be found (maybe they were deleted) NSLog(@"Error finding object: %@: %@", [e name], [e reason]); } 

当你使用NSManagedObject时,你可以检查NSManagedContext是否存在。 喜欢这个:

 if (obj.managedObjectContext) { //do things } 

你可以检查[myObject isFault] myObject是一个NSManagedObject实例