更改NSFetchedResultsController的fetchRequest.predicate不会触发委托

时间:2016-01-10 20:47:37

标签: ios objective-c nsfetchedresultscontroller nsfetchrequest

我的FRC NSPredicate上有fetchRequest。在某些时候,一个对象被添加到CoreData,我创建一个新的谓词,更新fetchRequest并执行获取:

self.fetchedAddressesController.fetchRequest.predicate = self.predicate;
BOOL success = [self.fetchedAddressesController performFetch:nil];

但是,这不会调用FRC的委托方法,如controllerWillChangeContent:。我的表视图没有更新。

但是,当我添加以下行时:

[self.tableView reloadData];

在上面显示的两个之下,我确实看到了预期的更新。这表明要显示的数据确实发生了变化。

我检查了新的谓词,没关系。我还将FRC的delegate设置为self,并在其他情况下调用其方法。

任何想法已经出了什么问题?

3 个答案:

答案 0 :(得分:1)

您所描述的行为是预期的。根据{{​​3}},如果要修改NSFetchedResultsController上的获取请求,则必须删除缓存(如果使用的是缓存),修改NSFetchRequest,然后调用performFetch :(它不会调用任何代表方法)。

如果您想知道谓词之间的变化,则需要存储旧状态并进行比较。我过去使用过的库是Apple documentation

答案 1 :(得分:0)

当您执行提取操作后,FRC会观察对其所关注的已获取对象集的更改时,将调用委托方法。如果你去更改谓词并进行新的提取,FRC将被重置,现在正在观察一组不同的对象。委托方法没有被调用,因为原始对象集中没有任何变化。

答案 2 :(得分:0)

如果您真的要更改实体,请小心...

我们遇到了一个棘手的问题,不仅改变了类别,而且改变了实际的实体类,所以对于两个不同的选项卡按钮,

let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CD_Cats")

但是然后..

let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CD_Dogs")

实际上,如果您这样做,则将无法使用:

func buttonLeft() {
    mode = .cats
    bringupFetchRequest()
    pull.feedForCats() // get fresh info if any at the endpoints
}

func buttonRight() {
    mode = .dogs
    bringupFetchRequest()
    pull.feedForDogs() // get fresh info if any at the endpoints
}

它最终会崩溃。

似乎您需要这个:

func buttonLeft() {
    mode = .cats
    bringupFetchRequest()
    tableView.reloadData()
    pull.feedForCats() // get fresh info if any at the endpoints
}

func buttonRight() {
    mode = .dogs
    bringupFetchRequest()
    tableView.reloadData()
    pull.feedForDogs() // get fresh info if any at the endpoints
}

(似乎)可靠地工作。

相关问题