【发布时间】: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