合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存

Posted

技术标签:

【中文标题】合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存【英文标题】:Transformable attribute updated in background thread context not being saved when being merged into main thread context 【发布时间】:2011-11-14 18:32:41 【问题描述】:

我有一个 NSManagedObject,其中包含一个日期列和一个可转换列(一个 NSDictionary)。日期列和可转换列都在其自己的上下文中的后台线程上更新,然后合并到主线程的上下文中。虽然日期列正在更新并正确保存,但可转换列没有。可转换列正在以这种方式更新:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];
NSMutableDictionary *newUserDataDictionary = [NSMutableDictionary dictionaryWithDictionary:object.userDataDictionary];            
//Updated newUserDataDictionary here 
object.date = calendarDay.date;
object.userDataDictionary = newUserDataDictionary;
if (![managedObjectContext save:&error]) 
  NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();

在 mergeChanges 中:我有以下内容:

- (void)mergeChanges:(NSNotification *)notification
    
AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// Merge changes into the main context on the main thread
[delegate.managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                              withObject:notification
                           waitUntilDone:YES];  

请帮忙。

【问题讨论】:

【参考方案1】:

问题一定出在mergeChangesFromContextDidSaveNotification 方法上。检查是否正在调用此方法。如果是,问题就出在那儿。

【讨论】:

以上是关于合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存的主要内容,如果未能解决你的问题,请参考以下文章

在后台线程中更新托管对象上下文

无法从 iOS6 中的后台线程调用主线程上的代码

保存子上下文时获取 NSFetchedResultsController 的批量更新

尝试捕获 NSManagedObjectContext 保存是不是有帮助?

临时托管对象未正确从子上下文合并到主上下文

在后台和主线程中使用托管对象上下文