繁体   English   中英

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

[英]NSFetchedResultsController, refetch data with external condition

我有一个NSFetchedResultsController来获取UITableView的数据。 在创建中的NSFetchedResultsController创建一个NSPredicate与外部条件对数据进行过滤。 重新获取数据的正确方法是什么? 只是取消我的__fetchedResultsController并重新创建它似乎有点残酷。

谢谢!

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

重要说明:调用此方法后,一定不能修改fetchRequest。 例如,您不得更改其谓词或排序顺序。

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

编辑:

相同的“ NSFetchedResultsController类引用”也在此处指出:

修改提取请求

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

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

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

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

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

(我希望我现在就知道了:-)

正如我在上面的评论中指出的那样,我已经解决了。 您需要做的是保存对NSFetchRequest的引用,并在需要时立即对其进行操作。 第二步,您需要告诉NSFetchedResultsController再次获取其数据。

我通过向默认的NSFetchedResultsController “ stack”添加两个新方法来做到这一点:

- (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进行初始化)以及每次外部依赖项更改时都调用这两个方法。 而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM