我的项目中启用了CoreData并发冲突断言,这对于跟踪和修复我们使用它时的错误非常有用。但是,我偶尔会遇到有关获取请求的问题,我无法确定我们做错了什么。
我们所有的托管上下文都是私有队列并发类型,而不是主队列并发类型。这是偶尔会触发并发冲突的代码块:
- (NSArray *)fetchFromCacheEntitiesWithClass:(Class)entityClass
predicate:(NSPredicate *)predicate
sortDescriptors:(NSArray *)sortDescriptors
managedContext:(NSManagedObjectContext *)managedContext
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:[entityClass entityName]];
request.predicate = predicate;
request.sortDescriptors = sortDescriptors;
request.fetchBatchSize = 30;
__block NSArray *results = nil;
[managedContext performBlockAndWait:^{
NSError *error = nil;
results = [managedContext executeFetchRequest:request error:&error];
NSAssert(!error, @"fetch had an error, investigate why");
}];
return results;
}
entityName方法存在于我们所有的CoreData类中,是从MOGenerator生成的,我已经仔细检查过它对我们所有的类都是正确的。此代码段中的违规发生在executeFetchRequest调用上。
有一点需要注意的是,我们只看到过这种情况发生在模拟器中,而不是在设备上。它让我倾向于模拟器错误,但我通常不喜欢将责任归咎于工具,因为开发人员错误更加普遍。