Ios 在NSOperation中查找NSManagedObject

Ios 在NSOperation中查找NSManagedObject,ios,objective-c,core-data,nsmanagedobjectcontext,magicalrecord,Ios,Objective C,Core Data,Nsmanagedobjectcontext,Magicalrecord,我认为[moc existingObjectWithID:self.objectID error:&error]是在线程中查找现有对象的正确方法,因为它的objectID,但我无法让它工作,为什么 背景/代码 我有一个已保存的NSManagedObject。我可以在主线程上看到它的所有属性。我在自定义init方法中将对象传递给我的NSOperation,并在该方法中保存其objectID: - (instancetype)initWithEntity:(NSManagedObject *)obj

我认为
[moc existingObjectWithID:self.objectID error:&error]
是在线程中查找现有对象的正确方法,因为它的
objectID
,但我无法让它工作,为什么

背景/代码 我有一个已保存的
NSManagedObject
。我可以在主线程上看到它的所有属性。我在自定义
init
方法中将对象传递给我的
NSOperation
,并在该方法中保存其
objectID

- (instancetype)initWithEntity:(NSManagedObject *)object
{
    self = [super init];
    if (self) {
        self.objectID = object.objectID;
        ...
    }
    return self;
}
然后在操作的
main
函数中,我查找我的对象以便使用它

- (void)main
{
    if (self.isCancelled) { return; }

    NSManagedObjectContext *moc = [NSManagedObjectContext MR_context];

    NSError *error = nil;
    self.object = [moc existingObjectWithID:self.objectID error:&error];

    if (error) {
        DDLogError(@"error finding object: %@", error);
    }

    ...
}
MR_context
是一种MagicalRecord方法,它只需使用并发类型
NSPrivateQueueConcurrencyType
设置一个新上下文,其父级设置为根保存上下文。所有这些在我看来都是正确的

错误 当没有设置调试器时,我只会得到对象的
错误。如果我试图查找它的任何属性,我会得到
nil

打开调试器并设置
-com.apple.CoreData.concurrenceydebug 1
后,我收到一些错误:

在模拟器中,我在
[moc existingObjectWithID:self.objectID error:&error]行上得到
EXC\u BAD\u指令(code=EXC\u i386\u INVOP,subcode=0x0)

在设备上,我在同一行上得到以下信息:

CoreData`+[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__]:
->  0x185946614 <+0>: brk    #0x1
但这也不行。有什么想法吗

更新 2015-07-10-好的,如果我使用带有
moc
的块,那么我可以从该块中正确访问对象

[moc performBlock:^{
    NSError *error = nil;
    NSManagedObject *o = [moc existingObjectWithID:self.objectID error:&error];
}];
如何正确提取该对象,以便在运行操作的线程中访问它?执行
\u块
属性,然后在块中设置它并在块外使用它失败


这是设置方式的问题吗?

MagicalRecord的上下文设置自己的队列以对其执行操作。因此,如果您想使用它来查找某些内容,则必须在块中执行(
[context performBlock:
[context performBlock andwait:
),以便它可以在自己的队列中执行该操作,然后返回到
NSOperation


我最后做的是创建一对
\uu块
属性,然后从块外的对象中提取所需的内容。

MagicalRecord的上下文设置自己的队列以对其执行操作。因此,如果您想使用它来查找某些内容,则必须在块中执行(
[context performBlock:
[context performBlock andwait:
),以便它可以在自己的队列中执行该操作,然后返回到
NSOperation


我最后做的是创建一对
\uu块
属性,然后从块外的对象中提取所需内容。

您提到它不是临时id-只是检查您是否通过调用objectID上的
isTemporaryID
来测试它?是的。对不起,我应该回来回答这个问题。我现在就这么做。你提到它不是一个临时id-只是检查一下你是否通过调用objectID上的
isTemporaryID
来测试它?是的。对不起,我应该回来回答这个问题。我现在就去。
[moc performBlock:^{
    NSError *error = nil;
    NSManagedObject *o = [moc existingObjectWithID:self.objectID error:&error];
}];