当从NSOperation在主线程上的NSManagedObjectContext上调用deleteObject:
时,是否还需要在主线程上引用objectID?目前我正在通过以下方式从NSOperation中删除主线程中的NSManagedObject ...
NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
- (void)deleteObject:(NSManagedObjectID *)objectID
{
// Delete on main context on the main thread
[mainContext performSelectorOnMainThread:@selector(deleteObject:)
withObject:[mainContext objectWithID:objectID]
waitUntilDone:YES];
}
它正在运作,但我想确保它不会在以后爆炸。我不确定的是,如果[mainContext objectWithID:objectID]
引用了来自NSOperation的NSManagedObjectContext,或者因为该方法调用在performSelectorOnMainThread:withObject:waitUntilDone:
内,它是否都在主线程上执行?
答案 0 :(得分:2)
NSManagedObjectID的实例可以安全地跨线程共享。但是,对mainContext objectWithID:的调用将获得实际的对象,这不是线程安全的。
你应该做的是把它包装在一个可以在主队列上执行的选择器或块中。
dispatch_async(dispatch_get_main_queue(), ^{
NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObject *obj = [mainContext objectWithID:objectID];
if (obj) {
[mainContext deleteObject:obj];
}
})
或者,您可以让主线程队列为您执行此操作:
[mainContext performBlock:^{
NSManagedObject *obj = [mainContext objectWithID:objectID];
if (obj) {
[mainContext deleteObject:obj];
}
}]
当然,所有这些都引出了一个问题,为什么你试图从另一个线程上的NSOperation实例中删除基于主线程的上下文中的对象?