Удаление NSManagedObject в основном потоке из NSOperation - PullRequest
0 голосов
/ 02 ноября 2011

При вызове deleteObject: для NSManagedObjectContext в основном потоке из NSOperation, мне также нужно ссылаться на objectID в основном потоке?В настоящее время я удаляю NSManagedObject в главном потоке из NSOperation следующим образом ...

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] ссылается на NSManagedObjectContext из NSOperation, или поскольку этот вызов метода находится в пределах performSelectorOnMainThread:withObject:waitUntilDone:, все ли это выполняется в основном потоке?

1 Ответ

2 голосов
/ 03 ноября 2011

Экземпляры 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 в другом потоке?

...