大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

正确使用 Core Data 多线程的 3 种方式

  • 2015-11-30
  • 本文字数:1535 字

    阅读完需:约 5 分钟

#Pragma Conference 2015 会议上,Marcus Zarra,撰写过关于 Core Data Core Animation 的书,叙述了三种在多线程环境下使用 Core Data 的方法并且设法解决在 2015 年应如何使用 Core Data 的问题。实际上,Zarras 说道,当用一个拥有十一年历史的技术比如 Core Data 工作时,你所面临的问题之一是有大量的信息是可用的,不过查明哪一份信息依旧精确以及哪一份不精确并不是一件简单的事。

根据 Zarras 所言,当我们知道我们仍旧有空余的 CPU 时我们应该使用多线程,那样我们可以预先处理用户接下来要使用的数据。多线程另外一个很重要的用例是通过允许用户不必等待一个冗长的操作来完成,来改进一个 app 的灵敏程度,比如网络操作。多线程几乎从来不是解决性能问题的办法并且它是一种基础设计决策,而不是一个事后的想法。

最初的方法

最初的方法是在 iOS 6 推出之前唯一可用的方法。这个方法现在依然可以使用,尽管 Zarra 建议除了在某些极端情况以外不要使用它。它基于四个主要的原则:

  • 一个 _NSPersistentStoreCoordinator_(PSC) 处理所有磁盘之间的相互影响。
  • NSManagedObjectContext__s (MOCs) 与 PSC 对话并且不知道对方的任何情况。
  • 其中一个 MOCs 负责 UI 的更新并且在单一可信来源上起作用。
  • 一个 MOC 开始意识到另一个 MOC 的变化的唯一方法是通过 merging 合并处理一个 _NSNotification_。

这个设计有一些不足之处,比如需要写很多公式化的代码,线程规则不明确会导致不定时发生崩溃以及意外线程阻塞。随着推出了 iOS 8,这些问题改善了一些。并且多亏了一个 debug flag 调试标志,Yosemite 才能在它违反 Core Data 并发模型的时候让应用程序崩溃。

艰难的方法

Zarras 称之为艰难的方法的是一个依赖于用于多进程访问 SQLite 的方法。这就意味着我们可以拥有多个 PSC,让每个 MOC 都可以拥有自己的 PSC。这会对摆脱任何锁定问题起到很好的作用并且启用几乎所有异步访问——除非你没有写相同的表以及同时把两个 PSC 排成一行。

即使有了这个设计,只用一个 MOC 来把数据反馈到 UI 是可取的。这个方法会让用 PSC 来同步数据变得艰难,因为它们不知道对方的任何情况。此外,线程和可维护性也会被损害。这个方法有趣的一面在于,这就是 iCloud 如何运作的真实写照。

最好的方法

根据 Zarra 所言,最好的办法并不是速度最快的,但它是到目前为止最简单和最可持续的方法。它依靠苹果和 iOS 6 一起推出的 new APIs ,new APIs 允许定义子 MOC 并且详细描述一个 MOC 的并发类型。Zarra 呈现的这个设计是基于 _NSManagedDocument_ 如何运作和使用的:

  • 一个单独的持久性数据协调器。
  • 唯一能实际访问 PSC 的一个私有的 MOC。
  • 一个主要的 MOC 联合 UI,它是私有的 MOC 的子设备。
  • 多个子 MOC 具体到辅助线程。

这个设计的好处是子 MOC 所有的变化会自动传送到其主 MOC 上,因此消除了合并的需求。

这个设计的主要缺陷是它速度缓慢,尽管只是慢了百分之几,Zarra 说道。它有一个很棘手的问题就是如果进行太多的异步操作,有可能会在 UI 上起连锁反应,因为其相关的 MOC 会受到序列的多重变化,这可能与另一个并不相干。

这个设计一个很重要的细节就是最好不要重复使用很便宜就能创造的子 MOC。另一方面,能用很久的子 MOC 应该与主 MOC 手动保持同步,因为变化仅仅是从子 MOC 到主 MOC 而反之则不行。

Zarra 的最后评论是使用 _NSManagedDocument_ 会锁定 UI,所以你最好做好准备

查看英文原文: Three Ways to Get Core Data Multithreading Right


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-11-30 18:004036
用户头像

发布了 218 篇内容, 共 78.3 次阅读, 收获喜欢 76 次。

关注

评论

发布
暂无评论
发现更多内容

一键部署?华为云Solution as Code如何成为AI秘籍?

脑极体

AI

Claude用不了?火山引擎为开发者上线“搬家”方案

火山引擎开发者社区

火山引擎

理想汽车智驾方案介绍 4 | World model + 强化学习重建自动驾驶交互环境

地平线开发者

自动驾驶 端到端 地平线征程6

征程 6E/M|多 camera 场景示例

地平线开发者

自动驾驶 算法工具链 地平线征程6

欢迎马恩岛政府加入Have I Been Pwned数据泄露查询平台

qife122

网络安全 政府合作

在AI技术快速实现创意的时代,挖掘新需求成为核心竞争力——某知名AI框架需求洞察

qife122

AI开发框架 技术演进

第十四届中国智能产业大会,藏着AI落地的答案

脑极体

AI

Claude 封禁中国?为啥我觉得是个好消息

Immerse

智能体(AI Agent)开发实战之【LangChain】(八)核心模块:代理(Agents),ReAct Agent

我和AI的成长

智能体 langchain AI Agent

Genie 3:世界模型的新前沿 - 实时交互环境生成技术突破

qife122

人工智能 实时生成

大数据-90 Spark RDD容错机制:Checkpoint原理、场景与最佳实践 容错机制详解

武子康

Java 大数据 flink spark 分布式

智能体(AI Agent)开发实战之【LangChain】(七)核心模块:链(Chains),手把手教你搞定工作流(1)

我和AI的成长

智能体 #LangChain AI Agent

基于YOLOv8的电瓶车/电动车识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

申公豹

人工智能

工业数字化 信息化经验总结(7)

万里无云万里天

数字化转型 信息化 工业 工厂运维

设备点检 设备维护经验总结(6)

万里无云万里天

工业 设备维护 工厂运维 设备点检

在AI技术快速实现创意的时代,挖掘专业文档处理新需求成为关键突破点

qife122

AI技术 需求挖掘

会议实时转录接口 Recall 完成 3800 万美元融资,深耕对话数据基建;Locally AI 推出本地实时语音交互丨日报

声网

qKnow 知识平台【开源版】发布 1.0.0 版本,全面落地知识管理与智能抽取能力

千桐科技

知识图谱 大模型 知识库 qKnow Java知识图谱

人体跌倒识别检测项目|全流程源码+数据集+可视化界面+一键训练部署

申公豹

人工智能

香蕉P图已经 Out 了!纳米 AI “P 视频” 才是王炸,视频生成到剪辑一站式搞定,丝滑出片!

阿星AI工作室

学习 AI 产品经理 大模型 AI工具

让数据真正用起来:qData 数据中台开放12大模块,赋能业务创新与智能分析

千桐科技

大数据平台 qData 开源数据中台 Java数据中台 千数平台

大数据-89 Spark应用必备:进程通信、序列化机制与RDD执行原理

武子康

Java 大数据 flink spark 分布式

天猫图片搜索相似商品API开发指南

tbapi

天猫API 天猫图片搜索接口 天猫拍立淘接口 天猫图片搜索API 天猫图片API

网络信息收集脚本详解

qife122

PowerShell 系统管理

2023年十大最佳游戏引擎指南:从Unity到Bevy全面解析

qife122

编程 游戏开发

恶性疟原虫检测系统基于YOLOv8的高效识别系统分享

申公豹

人工智能

Stack Exchange知识开放共享:现已在Snowflake Marketplace提供高质量AI训练数据

qife122

AI训练数据 知识共享

零压力了解 LoRA 微调原理

蛋先生DX

AI LoRa LLM 大模型微调 FineTuning

首个AI教育实训基地落地无锡惠山,摩尔线程携手科大讯飞等合作伙伴赋能未来人才

新消费日报

天猫商品视频API数据解析(附代码)

tbapi

天猫API 天猫商品视频API 天猫商品视频数据采集 天猫视频API 淘宝视频采集

Kaggle Grandmaster 的价值:不止于竞赛,更在于引领破局

咕泡科技

人工智能 Kaggle 咕泡ai 咕泡科技

正确使用Core Data多线程的3种方式_移动_Sergio De Simone_InfoQ精选文章