我目前正在開發一個使用核心數據來存儲數據的應用程序。應用程序通過下載和解析一個巨大的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]; }); }];
}
我失去了什麼東西?我應該在保存後臺上下文後保存主要的託管對象上下文嗎?
我編輯我的問題,並增加了一些示例代碼。正如你所看到的,沒有父子上下文模式,保存錯誤爲零。 – rokridi
您每次都在創建新的上下文。更新了答案。 – eofster
FootBallCoach對象在主要上下文中獲取。那麼你是說我應該保存主要的上下文嗎? – rokridi