如果核心数据设置为相同的值,核心数据是否将其视为已更改的值?
为了确保我select了正确的NSMergePolicy
我很好奇当前值是否被设置为能够引起跨多个上下文的合并冲突。
具体来说,在我的情况下,我想确保修改的标志将冲突,如果设置在一个不合时宜的保存。
例:
//... //on background thread, doing some work to an object because it's status was //set to Status_Modified [managedObjectContext performBlockAndWait:^{ object.status = Status_NotModified; [managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; [managedObjectContext save:&error]; }];
如果这样做,在主线程上,状态会被设置为Status_Modified
并保存? 对象状态是否保持为Status_Modified
? 也就是说,“地位”财产会被认为是变化的,因此引起冲突,从而打败我们的记忆变化(根据政策)?
所以,我找不到任何体面的文件来回答这个问题,但我已经做了一些testing,似乎该属性被认为是改变了。 这是我的怀疑,似乎同意由will
/ didSetValueForKey:
包裹的键值设置的各种引用didSetValueForKey:
我的testing:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSManagedObjectContext * uiCtx = [self contextForUIWork]; NSEntityDescription * entityDesc = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:uiCtx]; Entity * entity = [[Entity alloc] initWithEntity:entityDesc insertIntoManagedObjectContext:uiCtx]; entity.testproperty = @(1); NSError * error = nil; [uiCtx save:&error]; if (error) { assert(0); } NSManagedObjectID * objID = entity.objectID; [self doStuffToObjectWithIDOnAnotherThreadAndAnotherContext:objID]; entity.testproperty = @(2); [uiCtx setMergePolicy:NSErrorMergePolicy]; error = nil; [uiCtx save:&error]; if (!error) { //We do not hit this! Success! assert(0); } } -(void)doStuffToObjectWithIDOnAnotherThreadAndAnotherContext:(NSManagedObjectID*)objID { dispatch_barrier_sync(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ NSManagedObjectContext * bgCtx = [self contextForBackgroundWork]; Entity * bgEntity = (Entity*)[bgCtx objectWithID:objID]; [bgCtx performBlockAndWait:^{ //set to same value bgEntity.testproperty = bgEntity.testproperty; NSError * bgError = nil; [bgCtx save:&bgError]; if (bgError) { assert(0); } }]; }); }
(完整的testing代码在这里上传: https : //github.com/samskiter/CoreDataValueChangingTest )
从文档中引用确认这将远远胜过一些testing,显示它适用于这个特定版本的iOS。