BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Sergio De Simone 关注 12 他的粉丝 ,译者 刘嘉洋 关注 0 他的粉丝 发布于 2015年12月1日. 估计阅读时间: 5 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

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

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

最初的方法

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

  • 一个NSPersistentStoreCoordinator(PSC)处理所有磁盘之间的相互影响。
  • NSManagedObjectContexts (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好读者(已满),InfoQ读者交流群(#2)InfoQ好读者)。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT