gpt4 book ai didi

ios - NSFetchedResultsController 在管理对象被修改时通知其委托(delegate)删除更改,并且从不通知插入或更新

转载 作者:行者123 更新时间:2023-11-28 12:47:26 25 4
gpt4 key购买 nike

我有一个 UITableViewController,它是 NSFetchedResultsController 的委托(delegate)。我的 NSFetchedResultsControllerDelegate 函数是根据 Apple's documentation 中的“典型用途”设置的,将 TableView Controller 作为获取的结果 Controller 的委托(delegate)属性。

我还有一些 View Controller ,它们显示在 TableView 的顶部,可以在其中修改托管对象。这些修改是在相同 托管对象上下文中完成的。我的应用程序中只构造了一个托管对象上下文,它是全局访问的。 (我在我的对象上下文构造中放置了一些 print 语句,只是为了确保我不会不小心在别处重新构造它。)

当我修改其中一个托管对象时,委托(delegate)函数 controller:didChangeObject 被调用,但是 NSFetchedResultsChangeType 总是 .删除。当我创建一个托管对象时,委托(delegate)函数根本没有触发。

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

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

我试图为这种行为创建一个简单的演示,但是当我从一个空白的应用程序重新创建这种情况时,我没有看到这种行为。所以我的应用程序中的某些东西导致了这种奇怪的行为,但我不知道是什么。有什么想法吗?


额外信息:

谓词和排序描述符的实际构造是在几个不同的类上完成的,但是通过 print(resultsController.fetchRequest.predicate)print(resultsController.fetchRequest.sortDescriptors) 打印它们 给出以下内容:

Optional(readState == "2" OR readState == "1")

Optional([(readState, ascending, compare:), (title, ascending, compare:)])

我在我的 controller:didChangeObject: 方法中放置了一个 print 语句,我可以看到这只会通过 type.rawValue = 2 调用(即 .Delete),并且仅当我修改对象时,而不是当我创建它们时。

最佳答案

这与 NSFetchedResultsController 处理其 NSPredicate 的方式不一致。

如果 NSFetchedResultsController 是用一个提取请求构建的,该请求有一个谓词,该谓词在整数和字符串之间进行比较,如下所示:

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

这将导致谓词字符串为:

integerAttribute == "1"

在这种情况下,初始抓取工作正常:在抓取结果 Controller 上调用函数 performFetch() 返回 integerAttribute 等于 的所有对象>1(其中 integerAttributeInt32 类型)。

但是,对 NSFetchedResultsControllerDelegate 的通知无法正常工作。托管对象的修改会导致委托(delegate)收到 NSFetchedResultsChangeType.Delete 更改的通知。托管对象的创建根本不调用委托(delegate)。

为了消除所有这些怪异现象,请按如下方式修复谓词格式字符串:

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

关于ios - NSFetchedResultsController 在管理对象被修改时通知其委托(delegate)删除更改,并且从不通知插入或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com