我有一个包含两个托管对象上下文的应用程序:
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSManagedObjectContext *backgroundContext;
我的一个视图控制器是一个响应UITableView
的{{1}}控制器。当我获取对象(来自远程Web服务),然后我想在后台线程上处理数据,将更改合并到我的主NSFetchedResultsControllerDelegate
并更新UI。
使用我当前的设置,当我尝试获取新对象时,我得到以下异常。
managedObjectContext
此异常引发于:
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. *** -[__NSArrayM insertObject:atIndex:]: object cannot be nil with userInfo (null)
我的托管对象上下文是在名为- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
的单例类中创建的。它目前看起来像这样:
AppController
关于我遗失或做错的任何想法?
答案 0 :(得分:1)
我认为你必须在你的背景过程中创建你的backgroundContext。
你需要监听backgroundContext发送的通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:self.backgroundContext];
在我的情况下,runupdate在后台进程中运行:
- (void) runUpdate {
NSManagedObjectContext *managedContext = [[NSManagedObjectContext alloc] init];
managedContext.persistentStoreCoordinator = ...;
[updateController registerBackgroundMoc:managedContext];
//do all update stuff
NSError *error;
if (![managedContext save: &error] {
...
}
[updateController unregisterBackgroundMoc:managedContext];
}
在我的updateController中,我做了以下内容:
- (void) registerBackgroundMoc: (NSManagedObjectContext *) updateMoc {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(mergeChanges:) name: NSManagedObjectContextDidSaveNotification object: updateMoc];
}
- (void) unregisterBackgroundMoc: (NSManagedObjectContext *) updateMoc {
[[NSNotificationCenter defaultCenter] removeObserver: self name: NSManagedObjectContextDidSaveNotification object: updateMoc];
}