繁体   English   中英

automaticMergesChangesFromParent不执行任何操作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM