【问题标题】:NSFetchedResultsController not firing delegate method after merging update from background thread从后台线程合并更新后,NSFetchedResultsController 未触发委托方法
【发布时间】:2011-12-02 17:04:34
【问题描述】:

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

FRC 看起来是这样的,注意我已经将缓存设置为 nil:

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

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

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

- (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: 方法。

问题在于,虽然合并 inserts 会正确触发 FRC 委托方法(例如 controllerDidChangeContent:),但合并 updates 不会向 FRC 发出触发其委托的信号方法。

很奇怪,如果我使用 main MOC主线程 上运行更新,我还可以确认 FRC 正确地触发了它的委托。

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

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

【问题讨论】:

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


    【解决方案1】:

    哦.....伙计。

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

    我希望这对遇到此问题的其他人有所帮助。

    【讨论】:

    • 您能解释一下我的线程操作中的主MOC是什么意思吗?我在这里遇到同样的问题,我无法找到解决方案。提前谢谢你。
    • 您应该始终为每个线程创建一个新的托管对象上下文。无论如何,您都不应该跨线程使用一个托管对象上下文。
    • 这篇帖子stackoverflow.com/a/25673143/1433553 提供了 Apple 技术支持工程师关于如何调试多线程问题的建议。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多