为了确保我选择了正确的 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
? IE。 “状态”属性是否会被视为已更改并因此导致冲突并因此胜过我们的内存更改(根据策略)?
最佳答案
所以,我找不到任何像样的文档来回答这个问题,但我做了一些测试,似乎该属性被考虑改变了。这是我的怀疑,并且似乎同意对 will
/didSetValueForKey:
我的测试:
- (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);
}
}];
});
}
(此处上传完整测试代码:https://github.com/samskiter/CoreDataValueChangingTest)
来自文档的引用证实了这一点,这比仅显示它适用于该特定版本的 iOS 的一些测试要好得多。
关于ios - 如果核心数据设置为与原来相同的值,是否认为该值已更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26845790/