【发布时间】:2013-07-15 10:58:41
【问题描述】:
我在后台线程中更新核心数据,如下所示:
entry.message = [self contentForNoteWithEDML:note.content];
entry.dataLastModified = [NSDate date];
[entry.managedObjectContext save:nil];
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.tableView reloadData];
});
在表格视图的每个单元格上,它显示与fetchedResultsController 不同的条目。在主线程上,我在cellForRowAtIndexPath 中的dataLastModified 日期执行NSLog,并且日期不会更改为最新值。如果我关闭应用程序并再次运行它,它会更新单元格的内容并将dataLastModified 日期更改为正确的值。
它似乎正在根据需要更改数据,但我的tableview 在重新启动应用程序之前看不到更改。任何想法为什么?
编辑:在后台线程上执行 cellForRowAtIndexPath 中的 NSLog 会提供正确的数据,但在主线程上执行不会。
编辑 2:我的背景上下文如何工作:
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter
addObserver:[AppDelegate applicationDelegate].coreDataManager
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:[AppDelegate applicationDelegate].coreDataManager.managedObjectContext];
NSPersistentStoreCoordinator *journalDataPSC = [AppDelegate applicationDelegate].coreDataManager.managedObjectContext.persistentStoreCoordinator;
dispatch_queue_t addOrUpdateEntriesQueue = dispatch_queue_create("com.App.AddOrUpdateEntries", NULL);
dispatch_async(addOrUpdateEntriesQueue, ^{
NSManagedObjectContext *journalDataMOC = [[NSManagedObjectContext alloc] init];
[journalDataMOC setPersistentStoreCoordinator:journalDataPSC];
//Some code to get me an entry on this context
entry.message = [self contentForNoteWithEDML:note.content];
entry.dataLastModified = [NSDate date];
[entry.managedObjectContext save:nil];
[[NSNotificationCenter defaultCenter] removeObserver:[AppDelegate applicationDelegate].coreDataManager];
dispatch_async(dispatch_get_main_queue(), ^{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.tableView reloadData];
});
});
dispatch_release(addOrUpdateEntriesQueue);
【问题讨论】:
-
您是为后台线程使用子上下文还是手动创建的上下文?看起来更改没有传递到主上下文。
-
我正在使用手动创建的上下文。我将发布更多有关其工作原理的代码。
标签: iphone ios objective-c core-data nsmanagedobjectcontext