我的应用使用CoreData。它有一个UISegmentedControl和一个tableview。 UISegmentedControl用于根据不同的标准更新tableview。
UISegmentedControl的第一个选项将在单个tableview部分显示所有数据。所以我使用下面的代码 - (NSFetchedResultsController *)fetchedResultsController
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是不同的,每个都需要不同的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的代码示例。 谢谢。
SOLUTION:
除了@iTukker的想法之外,我在返回fetchedResultsController
之前添加了更多检查。如果没有此检查,此方法将返回fetchedResultsController
而不是执行switch .. case ..
语句。
- (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;
}
}
}
....
}
答案 0 :(得分:0)
假设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;
}
当segmentedController的值发生变化时
[frc release];
frc = nil;
[tableView reloadData];
希望这可以看出来