我已经看到了两种不同的方法,我想知道哪种方法是正确的。

具体来说,我正在谈论访问BG线程上的ManagedObject

我见过的方法是...

Person *person = ...
[MagicalRecord saveUsingBlock:^(NSManagedObjectContext *localContext) {
    Person *localPerson = [person inContext:localContext];
    // do stuff...
}]

但是我也看到了...
Person *person = ...
NSManagedObjectID *objectID = person.objectID;
[MagicalRecord saveUsingBlock:^(NSManagedObjectContext *localContext) {
    Person *localPerson = (Person*)[localContext objectWithID:objectID];
    // do stuff...
}]

后者似乎更正确,因为您不尝试跨线程访问对象。但是看到了两者之后,我不确定MagicalRecord是否做了一些神奇的事情来解决这个问题?

最佳答案

inContext:MR_inContext:的魔术记录“简写”,实现为

- (id) MR_inContext:(NSManagedObjectContext *)otherContext
{
    NSError *error = nil;
    NSManagedObject *inContext = [otherContext existingObjectWithID:[self objectID] error:&error];
    [MagicalRecord handleErrors:error];

    return inContext;
}

(请参阅https://github.com/magicalpanda/MagicalRecord/blob/master/MagicalRecord/Categories/NSManagedObject/NSManagedObject%2BMagicalRecord.m)。

因此,这都是在不同上下文中访问对象的有效方法,
一个使用existingObjectWithID,另一个使用objectWithID
对于这些之间的细微差异,请参阅文档或例如What's the difference between -existingObjectWithID:error: and –objectWithID:?

10-06 04:33