NSFetchedResultsController在被pipe理对象被修改时通知它的代理删除更改,并且从不通知插入或更新

我有一个UITableViewController ,这是NSFetchedResultsController的委托。 我的NSFetchedResultsControllerDelegate函数按照Apple文档中的 “Typical Use”进行设置,并将表视图控制器作为获取的结果控制器的委托属性。

我也有一些视图控制器,这些控制器显示在可以修改被pipe理对象的表格视图之上。 这些修改是在相同的托pipe对象上下文中完成的。 在我的应用程序中只有一个托pipe对象上下文构造,并且它是全局访问的。 (我已经把一些print语句放在我的对象语境结构中,以确保我不会在别处意外重新构build它)。

当我修改其中一个托pipe对象时,委托函数controller:didChangeObject被调用,但.Delete 始终是 .Delete 。 当我创build一个托pipe对象时,委托函数根本不会触发。

但是,当我手动调用performFetch()tableView.reloadData() ,单元格会恢复到正确的状态:删除的行返回,创build任何未插入的行。

结果是删除对象按预期工作(单元格被删除),但更新到对象会导致其单元格被删除,并且对象创build不会触发单元格插入。

我试图创build一个这种行为的简单演示,但是当我从一个空白的应用程序重新创build的情况下,我没有看到这种行为。 所以在我的应用程序中的东西是造成这种奇怪的行为,但我不知道什么。 有任何想法吗?


额外信息:

谓词和sorting描述符的实际构造是通过几个不同的类来完成的,但是通过print(resultsController.fetchRequest.predicate)print(resultsController.fetchRequest.sortDescriptors)如下:

可选(readState ==“2”或readState ==“1”)

可选([(readState,ascending,compare :),(title,ascending,compare :)])

我已经把一个打印语句放在我的controller:didChangeObject:方法中,而且我可以看到这只用type.rawValue = 2 (即.Delete.Delete ,只有当我修改对象时,而不是当我创build它们。

这与NSPredicate如何处理其NSPredicate是不一致的。

如果NSFetchedResultsController是由一个具有谓词的获取请求构造的,该谓词在整数和string之间进行比较,如下所示:

 let predicate = NSPredicate(format: "integerAttribute == %@", String(1)) 

这将导致谓词string为:

integerAttribute ==“1”

在这种情况下,初始提取工作正常:在提取结果控制器上调用函数performFetch()将返回integerAttribute等于1所有对象(其中integerAttribute的types为Int32 )。

但是, NSFetchedResultsControllerDelegate的通知不能正常工作。 被pipe理对象的修改导致委托被通知NSFetchedResultsChangeType.Delete更改。 托pipe对象的创build根本不调用委托。

为了使所有这些怪异消失,修复谓词格式string如下:

 let predicate = NSPredicate(format: "integerAttribute == %d", 1)