swift - 如何在 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() 之前创建的实体?
解决方案
我现在发现的唯一方法是过滤结果。它对我有用,因为我有自己的 UI 更新自定义逻辑,不确定它是否适用于所有人。
lists = fetchLists().filter { !$0.objectID.isTemporaryID }
其中列表是 [NSManagedObject](子类)。因此,当 CoreData 发生更改时,我只需使用所需的谓词获取并过滤掉所有临时 ID。当项目获得正确的 ID 时,控制器(:didChangeContentWith: diff) 再次触发并且一切正常。
仍在寻找通过跳过isTemporaryID对象进行获取的方法。
推荐阅读
- angular - 嵌套表单组找不到元素
- count - F#:尝试计算字符串中小写字母的数量时出现类型不匹配错误
- eclipse - 类路径文件在 Eclipse 中不可见,在 mac 系统上?
- go - 使用 || 将默认变量定义为变量
- awk - 文件中某个块中的列总和:awk 可以这样做吗?
- selenium - 在 QAF 中最大化 chrome 窗口
- netlogo - 在 Netlogo 中,如何将海龟移动到其链接的另一端?
- javascript - 此语句中关于 splice 的 javascript 语法问题 -> copy.push(array.splice(i,1)[0])
- javascript - react prop 更改时重新请求数据
- reactjs - 如何在反应中访问表列值