如何使用两个或更多NSFetchedResultsController?

时间:2012-05-27 09:18:34

标签: objective-c core-data

我的应用使用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;
           }
        }
    }

....

}

1 个答案:

答案 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];

希望这可以看出来