我有一个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拒绝注意到它。
答案 0 :(得分:2)
哦.....伙计。
看起来从我的线程操作中访问主MOC(即使它是与我试图更新的数据无关的任务)导致这种奇怪的行为。
我希望这能帮助遇到此问题的其他任何人。