首页 > 解决方案 > 如何在 context.save() 之前告诉 NSPredicate 跳过实体

问题描述

如何在保存 viewContext 之前防止触发控制器(:didChangeContentWith:diff)?在创建一个 NSManagedObject 对象后,我得到了控制器(:didChangeContentWith:diff)的触发,并且在保存了上下文之后,它也为同一个对象触发了两次。

首先,我创建 NSFetchedResultsController 并设置 fetchRequest.predicate

fetchedResultsController.fetchRequest.predicate = nil

然后当我添加项目时:

let newItem = Item(context: context) //controller fires right after this #1
...
...
context.save() // Fires here too #2

第一次 objectID 是错误的,第二次是正确的并根据上下文设置。那么,有没有办法告诉谓词跳过在 context.save() 之前创建的实体?

标签: swiftcore-datansfetchedresultscontrollerpredicate

解决方案


我现在发现的唯一方法是过滤结果。它对我有用,因为我有自己的 UI 更新自定义逻辑,不确定它是否适用于所有人。

lists = fetchLists().filter { !$0.objectID.isTemporaryID }

其中列表是 [NSManagedObject](子类)。因此,当 CoreData 发生更改时,我只需使用所需的谓词获取并过滤掉所有临时 ID。当项目获得正确的 ID 时,控制器(:didChangeContentWith: diff) 再次触发并且一切正常。

仍在寻找通过跳过isTemporaryID对象进行获取的方法。


推荐阅读