【发布时间】:2014-01-16 09:01:54
【问题描述】:
我目前正在开发一个使用 Core Data 来存储数据的应用程序。该应用程序通过下载和解析一个巨大的 XML 文件(大约 40000 个条目)将其内容与 Web 服务器同步。该应用程序允许用户搜索数据并对其进行修改 (CRUD)。提取操作太繁重,这就是我决定使用以下模式的原因:
“主线程的一个托管对象上下文 (NSMainQueueConcurrencyType) 以刷新用户界面。繁重的获取和更新是通过多个后台托管对象上下文 (NSPrivateQueueConcurrencyType) 完成的。不使用子上下文”。
我将一些对象提取到一个数组中(让我们说“用户”数组),然后我尝试在后台上下文中更新或删除一个“用户”(对象“用户”是从填充的数组中获得的)和最后我保存了那个上下文。
我正在收听 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]; }); }];}
我错过了什么吗?我应该在保存后台上下文后保存我的主要托管对象上下文吗?
【问题讨论】: