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)
- 核心数据实体关系不会在启动之间保存
- 如何使用CoreData检索列中最后插入的值?
- Swift 2.0核心数据 – TableView不读NSManagedObject
- Sqlite或核心数据来更新超过50000条logging
- NSManagedObject setter给我:无法识别的select器发送到实例
- NSFetchedResultsController在合并“NSManagedObjectContextDidSaveNotification”后没有显示所有结果
- 用核心数据计算一个简单的总和
- 重新添加xcdatamodel到生成设置
- 我是否需要启用WAL模式将.SQLite从包复制到Document目录?