Objective c 如何使用两个或多个NSFetchedResultsController?
我的应用程序使用CoreData。它有一个UISegmentedControl和一个tableview。UISegmentedControl用于根据不同的条件更新tableview UISegmentedControl的第一个选项将在单个tableview部分中显示所有数据。因此,我在-(NSFetchedResultsController*)fetchedResultsController中使用以下代码Objective c 如何使用两个或多个NSFetchedResultsController?,objective-c,core-data,Objective C,Core Data,我的应用程序使用CoreData。它有一个UISegmentedControl和一个tableview。UISegmentedControl用于根据不同的条件更新tableview UISegmentedControl的第一个选项将在单个tableview部分中显示所有数据。因此,我在-(NSFetchedResultsController*)fetchedResultsController中使用以下代码 frc = [[NSFetchedResultsController alloc] ini
frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[self managedObjectContext]
sectionNameKeyPath:nil
cacheName:@"Root"];
第二个选项将在多个tableview部分显示数据。所以我需要NSSortDescriptor并设置sectionNameKeyPath
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"city"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *frc = nil;
frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:[self managedObjectContext]
sectionNameKeyPath:@"city"
cacheName:@"Root"];
因为sectionNameKeyPath是不同的,每个sectionNameKeyPath都需要不同的NSSortDescriptor,所以我假设需要两个不同的NSFetchedResultsController
我用于重新加载tableview的代码:
- (void) touchDownAtSegmentIndex:(NSUInteger)segmentIndex{
NSPredicate *predicate;
NSError *error;
[NSFetchedResultsController deleteCacheWithName:@"Root"];
if(segmentIndex == 0)
{
}
else if(segmentIndex == 1)
{
}
else
{
return;
}
[[[self fetchedResultsController] fetchRequest] setPredicate:predicate];
[[self fetchedResultsController] performFetch:&error];
[[self tableView] reloadData];
}
任何人都可以向我提供使用两个NSFetchedResultsController的代码示例。
多谢各位
解决方案:
除了@iTukker idea,我还添加了更多检查,然后返回fetchedResultsController
。如果不进行此检查,此方法将返回fetchedResultsController
,而不是执行开关。。案例..
语句
- (NSFetchedResultsController*)fetchedResultsController {
.....
if ((fetchedResultsController!= nil) && [self.segmentChanged isEqualToString:@"false"])
return fetchedResultsController;
.....
if (frc == nil) {
switch (segmentendControl.selectedSegmentIndex) {
case 0: {
frc = ... //first frc
[frc retain];
break;
}
case 1: {
frc = ... //second frc
[frc retain];
break;
}
}
}
....
}
假设frc是控制器的一个实例变量,那么您会这样做
- (NSFetchedResultsController*)fetchedResultsController {
if (frc == nil) {
switch (segmentendControl.selectedSegmentIndex) {
case 0: {
frc = ... //first frc
[frc retain];
break;
}
case 1: {
frc = ... //second frc
[frc retain];
break;
}
}
}
return frc;
}
当分段控制器的值发生变化时
[frc release];
frc = nil;
[tableView reloadData];
希望这有意义谢谢。我假设您的答案是使用一个fetchedResultsController。我记得我也做过类似的事情。它只在应用程序首次加载时工作。但单击segmentedControl时,它没有响应。我将
[tableView reloadData]
放在(void)触地点的segmentIndex:(nsInteger)segmentIndex{
我注意到您在fetchedResultsController和[frc release]中使用了[frc retain];
当segmentedController更改时。我将尝试一下。Thx。是的,在您的viewsController中有一个frc。h您有类似NSFetchedResultsController*frc的东西。我将使用事件uicontrol事件值更改来重置frc并重新加载表数据。是的,您使用retain(当然不使用ARC时)由于您在fetchedResultsController方法中创建了一个新的frc(当它为nil时)。我还假设NumberOfSectionsTableView中的f.I.:您确实返回了[self-fetchedResultsController]。Sections必须明确,这一点很重要,在所有tableview数据源回调中,如numberOfRowsInsetions等。您始终使用[self-fetchedResultsController]并且不直接引用frc!它不起作用。我将NSLog
放入(NSFetchedResultsController*)fetchedResultsController
。日志显示它只调用了一次。每次segmentedcontrol更改时,它都不会再次执行。也许我真的需要多个NSFetchedResultsController
。