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];
}];