【发布时间】:2011-12-15 06:34:47
【问题描述】:
我有一个使用 Core Data 和默认 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];
}
但 AppDelegate 中的 mergeHandler 永远不会被调用。
【问题讨论】:
-
错误的对象传递给
addObserver:selector:name:object:。object应该是context。
标签: objective-c core-data nsmanagedobjectcontext