我一直在按照使用SQLite
后备存储库的存储库中的示例代码,将AFIncrementalStore合并到我们的应用程序中。所有示例都使用带有NSMainQueueConcurrencyType
的singleton managedObjectContext。
+ (NSManagedObjectContext *)managedObjectContext {
static NSManagedObjectContext *_managedObjectContext = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
});
return _managedObjectContext;
}
使用这个moc,我可以执行提取,看到它从网络中提取,并存储在sqlite后台存储中。我尝试将其更改为使用NSPrivateQueueConcurrencyType
,虽然我会看到网络请求,但从未将任何内容保存到SQLite
后备存储中。但是,如果我将这个moc留给主队列并发,然后从中创建一个子对象,并使用那个moc,那么一切都会很好地保存。
+ (User *)user
{
// grab a user if we already have one
NSManagedObjectContext *managedObjectContext = [VigilCoreDatabase managedObjectContext];
NSManagedObjectContext *tmpContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
tmpContext.parentContext = managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.fetchLimit = 1;
[fetchRequest setAffectedStores:@[ ]];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:tmpContext];
[fetchRequest setEntity:entity];
__block User *user = nil;
[tmpContext performBlockAndWait:^{
NSError *error = nil;
NSArray *fetchedObjects = [tmpContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
NSLog(@"error");
}
if(fetchedObjects.count > 0) {
user = fetchedObjects[0];
}
}];
return user;
}
我想弄清楚我的理解中是否遗漏了什么。我似乎找不到任何不使用具有主队列并发性的moc作为父上下文的示例(后台存储使用私有队列上下文),但同时也找不到解释是否需要这样做的任何文档,或者在使用私有队列上下文与在堆栈中使用主队列上下文时,是否需要手动将更改推送到父级。
此时AFIncrementalStore
出现错误。我问了一个SO关于另一个IncrementalStore的问题(它使用相同的代码),得到的回答让我相信AFIS需要NSMainQueueConcurrencyType