• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - Coredata fetch 不返回刚刚写入存储的结果

[复制链接]
菜鸟教程小白 发表于 2022-12-12 15:37:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

场景:

我在 IOS 上使用配置为针对 SQLite 数据库操作的 Magical 记录。默认情况下,MR 配置 coredata 将所有写回主线程上的父上下文序列化。

我使用的模式是,当我不在主线程上时,我使用诸如 MagicalRecord:MR_saveWithBlockAndWait 之类的东西为 coredata 操作创建一个单独的 NSManagedObjectContext。神奇的记录创建上下文,将其连接到父上下文,执行您在回调 block 中指定的任何操作并最终保存。重要的是,保存应该在操作完成之前提交。

当我完成后台线程的工作时,我通常会通知 UI 发生了一些事情;例如:某些内容已下载/上传/更改。

然后,在 UI 线程上,我使用主线程上的默认上下文创建一个新的 fetch 请求。问题是偶尔 coredata 找不到我之前提交的新对象。问题表现在微妙的竞争条件下,如果 UI 线程由于动画或其他一切正常运行而略微缓慢 - 但有时它找不到新对象。

从我读过的内容来看,获取请求总是应该进入磁盘。 MOC 上还有一个过时属性,但听起来这仅与缓存有关,如果您执行 fetch 请求,则会被绕过。

有没有人遇到过类似的问题并有什么见解?谢谢。



Best Answer-推荐答案


当然。如果您在后台托管对象上下文中保存更改,但您的 UI 上下文已经加载了该对象,则 UI 上下文可能只是从其缓存而不是存储文件中为您提供数据。

使用多个上下文的常用方法是:

  1. 观察 NSManagedObjectContextDidSaveNotification 以便您知道后台上下文何时保存更改。

  2. 在此通知的处理程序中,在 UI 上下文中调用 mergeChangesFromContextDidSaveNotification:,以便它使用来自其他上下文的更改来更新自身。

您可能希望在您的 UI 上下文中设置 mergePolicy,因为默认设置是在有任何冲突更改时放弃。

这适用于任何多上下文场景,其中每个上下文都需要使用不同上下文保存的更改进行更新。

关于ios - Coredata fetch 不返回刚刚写入存储的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19380145/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap