簡體   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