ios – 如何忽略NSManagedObjectContextWillSaveNotification中mergeChangesFromContextDidSaveNotification中的更改

我正在使用私有托管对象上下文在持久性存储中创建一些新对象,然后在保存私有MOC之后,使用mergeChangesFromContextDidSaveNotification将它们合并到主MOC中.这工作正常,并根据需要更新UI,并且此处不为mainMOC调用NSManagedObjectContextWillSaveNotification.

然后我使用UI对mainMOC进行一些更改,并监听NSManagedObjectContextWillSaveNotification.通知已发布,但它不仅包含我所做的编辑,还包含使用mergeChangesFromContextDidSaveNotification从PrivateMOC合并的对象.

有没有办法在后续的contextDidChange通知中忽略从另一个上下文合并到mainContext中的更改?

这是设置:

- (void) loadData {
   privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];

   privateContext.persistentStoreCoordinator = self.mainContext.persistentStoreCoordinator;

   [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(contextWillSave:)
                                             name:NSManagedObjectContextWillSaveNotification
                                           object: self.mainContext];

   NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:record.recordType inManagedObjectContext: self.privateContext];

   // fill in object

   if ([self.privateContext hasChanges]) {
       [self savePrivateContextAndMergeWithMainContext: self.privateContext];
   }
}

- (void) savePrivateContextAndMergeWithMainContext: (NSManagedObjectContext *) privateContext {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(privateContextDidChange:) name:NSManagedObjectContextDidSaveNotification object:privateContext];
    __block NSError *error = nil;
    [privateContext performBlockAndWait:^{
        NSLog(@"PrivateContext saved");
        [privateContext save:&error];
    }];


    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:privateContext];

    if (error) {
        NSLog(@"error = %@",error);
    }
}

- (void) privateContextDidChange: (NSNotification *) notification{

    [self.mainContext performBlockAndWait:^{
        NSLog(@"merged into mainContext");
        [self.mainContext mergeChangesFromContextDidSaveNotification:notification];
    }];
}

这样可以正常工作并保存私有上下文并且合并到mainContext中不会触发contextWillSave通知.但是,在从UI(在主MOC上)编辑数据时,会触发通知并包含先前使用私有MOC保存的数据.

希望很清楚.如果我应该包含其他任何内容,请告诉我.

– 更新 –

似乎问题是专门从私有上下文中删除对象.从私有上下文中删除,并在主MOC上调用mergeChangesFromContextDidSaveNotification后,mainMoc的deletedObjects集仍然显示删除的对象.私有上下文中的插入或更新不会发生这种情况.这在任何地方记录?可能的解决方法是什么?

解决方法

像这样修改privateContextDidChange ……
- (void) privateContextDidChange: (NSNotification *) notification{
    if (notification.object == PrivateMOC) {
        [self.mainContext performBlockAndWait:^{
            NSLog(@"merged into mainContext");
            [self.mainContext mergeChangesFromContextDidSaveNotification:notification];
        }];
    }
}

…其中PrivateMOC是对私有托管对象上下文的引用?

相关文章

背景 前端时间产品经理决定使用百度统计,使得 工程B 中原统计sdk-友盟统计,需要被去除。之前尝试去除...
结论: alloc负责分配内存和创建对象对应的isa指针; init只是返回alloc生成的对象。 所以alloc后,多次...
更新 如果UI愿意把启动图切割成n份,按一定约束在launchscreen.storyboard中进行排版,启动图效果会更好...
最近在看一本书《Effective OC 2.0》,今天看到有个tip是OC适中循环各自优劣性,作者最终推荐此块循环。...
// // ViewController.m // paintCodeTestOC //gif // Created by LongMa on 2019/7/25. // #import &a...
背景介绍 一般情况下,出于省电、权限、合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但...