NSFetchedResultsController,用外部条件重新获取数据

时间:2012-08-08 08:24:06

标签: uitableview nsfetchrequest nsfetchedresultscontroller

我有一个NSFetchedResultsController来获取UITableView的数据。在创建NSFetchedResultsController期间,我创建了一个NSPredicate,用外部条件过滤数据。重新获取数据的正确方法是什么?只是把我的__fetchedResultsController弄清楚并重新创造它似乎有点残酷。

谢谢!

2 个答案:

答案 0 :(得分:0)

initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:文档声明:

  

重要提示:调用此方法后,您不得修改fetchRequest   方法。例如,您不得更改其谓词或排序   排序

因此,当谓词发生变化时,您必须重新创建FRC(并在表视图上调用reloadData

修改

相同的“NSFetchedResultsController类引用”也指出here

  

修改获取请求

     

您不能简单地更改获取请求   修改结果。如果您想更改获取请求,那么您   必须:

     
      
  1. 如果您使用缓存,请将其删除(使用deleteCacheWithName :)。   通常,如果要更改提取,则不应使用缓存   请求。
  2.   
  3. 更改提取请求。
  4.   
  5. 调用performFetch:。
  6.   

所以我上面的第一个答案可能是错的。如果我理解正确的话:

  • 您无法修改分配给FRC的获取请求。
  • 但是,如果您按照上述三个步骤操作,则可以构建获取请求(使用新谓词)并将其分配给FRC(controller.fetchRequest = newFetchRequest)。

这意味着您不必重新创建FRC本身。

(我希望我现在得到它: - )

答案 1 :(得分:0)

正如我在上面的评论中指出的那样,我想出来了。您需要做的是保存对NSFetchRequest的引用,并在需要时立即操纵它。第二步,您需要告诉NSFetchedResultsController再次获取数据。

我通过向默认的NSFetchedResultsController“堆栈”添加两个新方法来实现此目的:

- (void)configureFetchRequest {  
    NSObject *myExternalDependency = …;

    if (!__fetchRequest) {
        __fetchRequest = [[NSFetchRequest alloc] init];
    }

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:self.managedObjectContext];
    [__fetchRequest setEntity:entity];

    NSPredicate *filter = [NSPredicate predicateWithFormat:@"someValue == %@", [myExternalDependency someProperty]];
    [__fetchRequest setPredicate:filter];
}

- (void)performFetch {
    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}

所以我现在基本上做的是在创建__fetchedResultsController时调用这两个方法(当然我使用__fetchRequest进行初始化)以及每次外部依赖关系发生变化时。就是这样。