从NSOperation中删除主线程中的NSManagedObject

时间:2011-11-01 21:58:37

标签: core-data nsmanagedobject nsoperation nsmanagedobjectcontext

当从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:内,它是否都在主线程上执行?

1 个答案:

答案 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实例中删除基于主线程的上下文中的对象?