如何确保在使用MagicalRecord 3.0保存后台线程后通知NSFetchedResultsController

时间:2014-07-19 22:02:20

标签: objective-c multithreading core-data magicalrecord nsfetchedresultscontroller

我正在使用带有ClassicWithBackgroundCoordinatorSQLiteMagicalRecordStack堆栈和NSFetchedResultsController的MagicalRecord 3.0。在Magical Record使用后台线程(通过[MagicalRecord saveWithBlock:])保存新的相关数据之后,NSFetchedResultsController没有被更新的问题。

如此初始化堆栈:

    MagicalRecordStack *stack = [[ClassicWithBackgroundCoordinatorSQLiteMagicalRecordStack alloc] initWithStoreNamed:@"Mailstrom.sqlite"];
    [MagicalRecordStack setDefaultStack:stack];

NSFetchedResultsController初始化如下:

    NSFetchRequest *request = [NSClassFromString(_entityName)
                               MR_requestAllSortedBy:_weightProperty
                               ascending:NO
                               withPredicate:[NSPredicate predicateWithFormat:@"%K>%d", _weightProperty, 0]];

    request.sortDescriptors = @[ [[NSSortDescriptor alloc] initWithKey:_weightProperty ascending:NO] ];

    _fetchedResultsController = [[NSFetchedResultsController alloc]
                                     initWithFetchRequest:request
                                     managedObjectContext:[[MagicalRecordStack defaultStack] context]
                                     sectionNameKeyPath:nil
                                     cacheName:nil];

    self.fetchedResultsController.delegate = self;
    [_fetchedResultsController MR_performFetch];

偶尔会通过[MagicalRecord saveWithBlock:]进行保存,但大多数情况下,仅为背景上下文发送NSManagedObjectContextWillSaveNotification,而FRC只是坐在那里:

====>> context will save: saveWithBlock:completion: on *** BACKGROUND THREAD ***

在这种情况下,FRC永远不会收到通知,并且其代理人的controllerWillUpdateContent永远不会被解雇。

我觉得这可能是一个简单的问题 - 更好地致电扫罗! ;)任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

如果您的保存最终到达默认上下文,那么您获取的结果控制器最终将使用最新信息重新加载。可能是ClassicWithBackgroundCoordinatorMagicalRecordStack未正确设置以通过该堆栈的“context”属性进行保存。

答案 1 :(得分:0)

我想我想出来了。

当在后台PSC中更新值时,需要调整主上下文以查看对象的更改。最简单的方法是通过URI-> ObjectID-> Object查找主对象库中的值,并在[MagicalRecord save]块内运行[willAccessValueForKey:nil]。这样,当更改合并到主上下文中时,即使来自后台PSC的更新只是更改,他们也会知道它们已经出现故障。