我的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
,并在其他情况下调用其方法。
任何想法已经出了什么问题?
答案 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
}
(似乎)可靠地工作。