将fetch请求上的CoreData并发冲突分派到适当的托管上下文

时间:2016-05-05 00:16:42

标签: ios objective-c core-data concurrency

我的项目中启用了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调用上。

有一点需要注意的是,我们只看到过这种情况发生在模拟器中,而不是在设备上。它让我倾向于模拟器错误,但我通常不喜欢将责任归咎于工具,因为开发人员错误更加普遍。

0 个答案:

没有答案