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该对象是否存在。
两种方法:
- 只要您的数据被删除,刷新视图数据源。 您可以通过注册
NSManagedObjectContextObjectsDidChangeNotification
通知,然后parsing该通知上的userInfo
来查看哪个对象被删除。 - 在将数据传递给多个线程时,请使用类似于下面的代码。
例:
// 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
实例