我目前正在开发一个使用Core Data存储数据的应用程序。应用程序通过下载和解析一个巨大的XML文件(大约40000个条目)来同步其内容和Web服务器。该应用程序允许用户搜索数据并对其进行修改(CRUD)。获取操作太重,这就是我决定使用以下模式的原因:
“主线程(NSMainQueueConcurrencyType)的一个托管对象上下文,以刷新用户界面。通过多个后台托管对象上下文(NSPrivateQueueConcurrencyType)完成大量获取和更新。不使用子上下文”。
我将一些对象提取到数组中(让我们说“用户”数组),然后我尝试在后台上下文中更新或删除一个“用户”(从填充的数组中获取对象“user”)最后我保存了这个背景。
我正在收听 NSManagedObjectContextDidSaveNotification 并将所有修改合并到我的主线程托管对象上下文中。
除非重新启动我的应用程序,否则每件事情都能正常工作,我意识到没有任何修改已被保存。
以下是一些解释使用模式的代码
主要管理对象上下文:
-(NSManagedObjectContext *)mainManagedObjectContext {
if (_mainManagedObjectContext != nil)
{
return _mainManagedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainManagedObjectContext setPersistentStoreCoordinator:coordinator];
return _mainManagedObjectContext;
}
后台管理对象上下文:
-(NSManagedObjectContext *)newManagedObjectContext {
NSManagedObjectContext *newContext;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[newContext performBlockAndWait:^{
[newContext setPersistentStoreCoordinator:coordinator];
}];
return newContext;
}
更新记录:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
FootBallCoach *coach = [_coaches objectAtIndex:indexPath.row];
coach.firstName = [NSString stringWithFormat:@"Coach %i",indexPath.row];
NSManagedObjectContext *context = [[SDCoreDataController sharedInstance] newManagedObjectContext];
[context performBlock:^{
NSError *error;
[context save:&error];
if (error)
{
NSLog(@"ERROR SAVING : %@",error.localizedDescription);
}
dispatch_async(dispatch_get_main_queue(), ^{
[self refreshCoaches:nil];
});
}];
}
我错过了什么吗?我应该在保存背景上下文后保存我的主要托管对象上下文吗?
答案 0 :(得分:1)
如果您的上下文配置了持久性存储协调器,则save应该将数据写入存储。如果您的上下文配置了另一个上下文作为父级,则save会将数据推送到父级。只有当保存了配置了持久存储协调器的最后一个父节点时,才会将数据写入存储。
-save:
。-performBlock...:
方法使用背景上下文。更新
每次调用-newManagedObjectContext
方法时,都会创建一个新的上下文。此上下文对您正在更新的FootBallCoach对象一无所知。您需要保存FootBallCoach对象所属的相同上下文。
不要忘记每个对象属于一个且只有一个上下文。
另外,请确保对您正在使用的对象的上下文保持强引用。