从后台线程合并更新后,NSFetchedResultsController不会触发委托方法

时间:2011-10-07 02:42:40

标签: objective-c ios core-data nsfetchedresultscontroller nsmanagedobjectcontext

我有一个NSFetchedResultsController和一些操作,可以通过NSOperationQueue在不同的线程上插入和更新托管对象。

FRC看起来像这样,请注意我已将缓存设置为nil:

[NSFetchedResultsController deleteCacheWithName:nil];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];

每个线程操作都有自己的托管对象上下文,并在每次保存更改时将mergeChangesFromContextDidSaveNotification触发到主MOC。

我用来合并上下文的代码如下所示:

- (void)mergeContextChanges:(NSNotification *)notification
{
    NSManagedObjectContext *context = [fetchedResultsController managedObjectContext];

    if([NSThread isMainThread] == NO)
    {
        [self performSelectorOnMainThread:_cmd withObject:notification waitUntilDone:NO];
        return;
    }

    NSSet *updated = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];

    for(NSManagedObject *thing in updated)
    {
        NSLog(@"Background thread updated %@", [thing description]);
    }

    for(NSManagedObject *thing in updated)
    {
        [[context objectWithID:[thing objectID]] willAccessValueForKey:nil];
    }

    [context mergeChangesFromContextDidSaveNotification:notification];
}

我可以通过查看每次后台操作插入或更新数据的日志来确认,我的mergeContextChanges:方法正在使用正确的插入/更新值进行调用。

问题是,合并插入时正在触发FRC委托方法(例如controllerDidChangeContent :),合并更新并不表示FRC触发其委托方法

奇怪的是,如果我使用主要MOC 主线程上运行更新,我还可以确认FRC正确触发其代理。

如果合并更新的MOC,如何让FRC触发其委托方法?

更多信息:看起来使用除主MOC之外的任何MOC并尝试将更新合并到主MOC具有相同的结果; FRC拒绝注意到它。

1 个答案:

答案 0 :(得分:2)

哦.....伙计。

看起来从我的线程操作中访问主MOC(即使它是与我试图更新的数据无关的任务)导致这种奇怪的行为。

我希望这能帮助遇到此问题的其他任何人。