Objective c 如何使用两个或多个NSFetchedResultsController?

Objective c 如何使用两个或多个NSFetchedResultsController?,objective-c,core-data,Objective C,Core Data,我的应用程序使用CoreData。它有一个UISegmentedControl和一个tableview。UISegmentedControl用于根据不同的条件更新tableview UISegmentedControl的第一个选项将在单个tableview部分中显示所有数据。因此,我在-(NSFetchedResultsController*)fetchedResultsController中使用以下代码 frc = [[NSFetchedResultsController alloc] ini

我的应用程序使用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是不同的,每个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