[英]automaticallyMergesChangesFromParent doesn't do anything
我正在观看有关某些“新”更改的WWDC 2016(Core Data中的新增功能)视频,在某些时候,有人说此新属性automaticallyMergesChangesFromParent
应该自动合并子级上下文中父级的更改。
我创建了一个简单的测试用例:
CustomObject *customObject = [[CustomObject alloc] initWithContext:self.persistentContainer.viewContext];
customObject.name = @"TEST";
customObject.customID = 2252;
self.persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
NSManagedObjectContext *firstContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
firstContext.parentContext = self.persistentContainer.viewContext;
firstContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
firstContext.automaticallyMergesChangesFromParent = YES;
CustomObject *contextObj = [firstContext objectWithID:customObject.objectID];
NSLog(@"NAME [%@]", contextObj.name);
customObject.name = @"JO";
[self.persistentContainer.viewContext save:NULL];
NSLog(@"NAME [%@]", contextObj.name);
输出为:
NAME [TEST]
NAME [TEST]
我希望是这样的:
NAME [TEST]
NAME [JO]
如果我使用[firstContext refreshAllObjects];
它会按我预期的那样工作,但是如果将automaticallyMergesChangesFromParent
设置为YES或NO,则没有区别。
我是否想知道应该如何工作? 该文档没有太大帮助。
谢谢。
您正在firstContext中获取和更新对象。 要automaticallyMergesChangesFromParent
验证self.persistentContainer.viewContext
,您应该从self.persistentContainer.viewContext
获取并更新。
self.secondObject = [[SecondCustomObject alloc] initWithContext:self.persistentContainer.viewContext];
self.secondObject.name = @"TEST";
self.persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
NSManagedObjectContext *firstContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
firstContext.parentContext = self.persistentContainer.viewContext;
firstContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
firstContext.automaticallyMergesChangesFromParent = YES;
//firstContext.stalenessInterval = 0;
SecondCustomObject *contextObj = [self.persistentContainer.viewContext objectWithID:self.secondObject.objectID];
NSLog(@"NAME [%@]", contextObj.name);
contextObj.name = @"JO";
[self.persistentContainer.viewContext save:NULL];
SecondCustomObject * contextObj1 = [firstContext objectWithID:self.secondObject.objectID];
NSLog(@"NAME [%@]", contextObj.name);
NSLog(@"NAME [%@]", contextObj1.name);
NAME [TEST]
NAME [JO]
NAME [JO]
automaticallyMergesChangesFromParent = YES;
设置时, automaticallyMergesChangesFromParent = YES;
然后在父上下文中进行保存,CoreData会通过在子队列上分派此块(通过照常调用performBlock:
:)来自动在子上下文上调用mergeChangesFromContextDidSaveNotification:
当两个上下文都在主队列上工作时,您只会在下一个主循环上看到更改
尝试
CustomObject *contextObj = [firstContext objectWithID:customObject.objectID];
NSLog(@"NAME [%@]", contextObj.name);
customObject.name = @"JO";
[self.persistentContainer.viewContext save:NULL];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"NAME [%@]", contextObj.name);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.