ios - 如果核心数据设置为与原来相同的值,是否认为该值已更改?

标签 ios objective-c core-data

为了确保我选择了正确的 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/

相关文章:

ios - 开发一个iPhone应用程序,就像地址簿的简化版本

ios - 用于标记 Google Maps SDK、Swift 2.0 的自定义信息窗口

objective-c - 我的 .xcdatamodel 中的空心箭头是什么?

ios - UIDocument openWithCompletionHandler : forces NSMetadataQuery to update

objective-c - 多次调用 'release'?

ios - NSArray 与 NSManagedObject 的关系在 UITableView 的第二个显示上出错

ios - WatchKit openParentApplication :reply

ios - 为什么我的 MKPointAnnotation 在 View 加载时没有出现?

iphone - iOS app拍照后是否可以避开 "use"/"retake"画面?

ios - 用 Objective C 编写的成功和失败 block ,在 swift 中显示错误