需要帮助设置后台管理对象上下文。在FRC controllerDidChangeContent上获取异常

时间:2014-03-02 15:03:26

标签: ios objective-c multithreading cocoa-touch nsfetchedresultscontroller

我有一个包含两个托管对象上下文的应用程序:

@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

关于我遗失或做错的任何想法?

1 个答案:

答案 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];
}