我已经看到了两种不同的方法,我想知道哪种方法是正确的。
具体来说,我正在谈论访问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:?。