如何使用两个或更多NSFetchedResultsController?
我的应用程序使用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的代码示例。 谢谢。
解:
除了@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;
}
}
}
....
}
你会做的是这样的,假设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];
希望这使得sence
链接地址: http://www.djcxy.com/p/36099.html上一篇: How to use two or more NSFetchedResultsController?
下一篇: Custom Section Name Crashing NSFetchedResultsController