2

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

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

我见过的方法是...

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做了一些神奇的事情来解决这个问题?

4

1 回答 1

2

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)。

因此,两者都是跨不同上下文访问对象的有效方法,一个是 using existingObjectWithID,另一个是objectWithID. 对于这些之间的细微差别,请参阅文档或例如What's the difference between -existingObjectWithID:error: 和 –objectWithID:? .

于 2013-03-11T13:58:03.743 回答