0

我有一个NSFetchedResultsController要获取的数据UITableView。在创建过程中,NSFetchedResultsController我创建了一个NSPredicate使用外部条件过滤数据的方法。重新获取数据的正确方法是什么?只是取消 my__fetchedResultsController并重新创建它似乎有点残酷。

谢谢!

4

2 回答 2

0

initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:文档指出:

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

reloadData因此,当谓词更改时,您必须重新创建 FRC(并调用表视图)。

编辑:

同样的“NSFetchedResultsController 类参考”也在这里声明:

修改获取请求

您不能简单地更改获取请求来修改结果。如果要更改获取请求,则必须:

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

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

  • 您不能修改分配给 FRC 的提取请求。
  • 但是,如果您遵循上述三个步骤,您可以构建一个的获取请求(带有一个新的谓词)并将其分配给 FRC ( )。controller.fetchRequest = newFetchRequest

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

(我希望我现在明白了 :-)

于 2012-08-13T11:14:32.107 回答
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)以及每次我的外部依赖项发生变化时。就是这样。

于 2012-08-14T14:33:39.200 回答