У меня есть проект, использующий базовые данные со стандартным AppDelegate. У меня есть следующий поток в моем коде, где загружается изображение для моего NSManagedObject WSObject
. Как вы заметите, я создаю новый NSManagedObjectContext
для этой фоновой темы. Я пытался прочитать различные документы и другие темы форума в Интернете, но не могу понять, как я могу уведомить свой основной контекст в AppDelegate после сохранения моего объекта в фоновом контексте.
- (void) downloadImageForObjectID:(NSManagedObjectID*)objectID {
dispatch_queue_t imageDownloaderQueue = dispatch_queue_create("imagedownloader", NULL);
dispatch_async(imageDownloaderQueue, ^{
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = [(AppDelegate *)[[UIApplication sharedApplication] delegate] persistentStoreCoordinator];
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
WSObject *item = (WSObject*)[context objectWithID:objectID];
item.image.data = [item.image download];
if ([context hasChanges]) {
NSError *error = nil;
[context save:&error];
}
});
dispatch_release(imageDownloaderQueue);
}
Может кто-нибудь сказать мне, что добавить к этому методу и AppDelegate, чтобы это работало? Насколько я понимаю, NSManagedObjectContextDidSaveNotification
отправляется, когда я сохраняю контекст в фоновом потоке. Какой код я должен добавить в мой AppDelegate для прослушивания этого уведомления и что делать, когда уведомление получено?
EDIT1:
Я добавил наблюдателя в фоновую ветку.
if ([context hasChanges]) {
NSError *error = nil;
NSManagedObjectContext *mainContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeHandler:) name:NSManagedObjectContextDidSaveNotification object:mainContext];
[context save:&error];
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:mainContext];
}
Но mergeHandler
в AppDelegate никогда не вызывается.