核心数据:缺少(null)

时间:2016-09-16 15:47:07

标签: objective-c core-data prefetch

在Core Data中,我有一个需要批处理错误的计算案例。我使用以下方法来执行此操作,并同时预取一些链接的实体。大部分时间一切正常,但偶尔会有一些用户崩溃:

Fatal Exception: NSInternalInconsistencyException
missing variable binding for (null)

以下是我用来执行此操作的方法:

NSFetchRequest *request = [CoreDataWrapper fetchRequestForEntity:entityName inManagedObjectContext:aContext];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self IN %@", entities];
[request setPredicate:predicate];
[request setReturnsObjectsAsFaults:NO];
[request setRelationshipKeyPathsForPrefetching:entityPaths];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:sortKey ascending:ascending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];

NSError *error;
NSArray *results = [aContext executeFetchRequest:request error:&error];

return results;

有什么想法吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

与Apple联系之后,以下是我的回答:

  1. 只使用基于队列的上下文,意思是在需要创建NSManagedObjectContext实例时使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType调用 - (instancetype)initWithConcurrencyType:

  2. 使用performBlock(AndWait)包装访问上下文及其对象的代码。

  3. 如果需要跨不同的上下文传递Core Data对象,请使用NSManagedObjectID,而不是NSManagedObject。

  4. 在我的情况下,我有一种在后台线程中使用核心数据的旧方法,所以我需要在我的代码中使用performBlock。

    那就是它!