单个NSMangedObjectContext上的多个NSFetchedResultsController

时间:2012-10-10 14:52:29

标签: core-data ios4 nsmanagedobjectcontext nsfetchedresultscontroller

我正在运行最新的XCode(4.5.1)和ios模拟器5.1。 所以这就是问题,我在一个核心数据模型中有两个实体,两个tableview控制器代表它们。我想设置两个NSFetchedResultsControllers(每个tableviewcontroller一个),它们都在相同的上下文中工作,但是在不同的实体上。当我创建第一个时,一切都很好,但是在initWithFetchRequest:方法中创建第二个强制EXC_BAD_ACCESS。 我可以提供使用的代码,但我相信这不是必要的。基本上,这是可能的,如果不是,那么我希望看到一个更好的解决方案来解决我的问题。 编辑:代码:

showController.context = managedObjectContext;

self.showcaseController = [[UINavigationController alloc]initWithRootViewController:showController];
self.showcaseController.tabBarItem.title = @"Витрина";

categoryController = [[UMCategoriesController alloc] initWithNibName:@"UMCategoriesController" bundle:nil];
categoryController.context = managedObjectContext;

self.categoriesController = [[UINavigationController alloc]initWithRootViewController:categoryController];

所以基本上我有一个UITabBarController,里面装满了两个UINavigationControllers,每个都是用UIViewController开始的,每个都有UITableView。我只是设置在AppDelegate中创建的NSManagedObjectContext。 这是UMShowcaseController.m NSFetchedResultsController的setter。当我在这里使用NSFetchedResultsController时,这非常有效。

-(NSFetchedResultsController *) frc
{
if (_frc != nil)
{
    return _frc;
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Goods" inManagedObjectContext:context]];
_frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
_frc.delegate = self;
NSError __autoreleasing *error = nil;

if (![_frc performFetch:&error]) {
}
return _frc;
}

但是,当我将NSFetchedResultsController添加到第二个UIViewController,UMCategoriesView时 - 它会崩溃。

if (_frc != nil)
{
    return _frc;
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Categories" inManagedObjectContext:context]];
_frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; //here it fails
_frc.delegate = self;
NSError __autoreleasing *error = nil;

if (![_frc performFetch:&error]) {
}
return _frc;

1 个答案:

答案 0 :(得分:0)

我该死的。 这里唯一缺少的是第二个NSFetchedResultsController中的排序描述符。 重新阅读文档后,一切正常。

阅读文档,不要忘记设置排序描述符。

马丁,谢谢你的评论,是你让我重新阅读文档。