50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

正确使用 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:004011
用户头像

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

关注

评论

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

Redis的数据类型实践

javaadu

Redis 核心技术与实战 Redis 数据结构

模块 6 作业 拆分电商系统为微服务

王大胖

C#调用C++动态库接口函数和回调函数

DS小龙哥

3月月更

iOS内存管理篇

刁架构

内存管理 iOS 知识体系

使用Node.js、MongoDB、Fastify 构建API服务

devpoint

mongodb nodejs swagger REST API 3月月更

Python GUI编程:关于 tkinter 怎么才能写出更好看的界面

程序媛可鸥

Python 程序员 面试

Python 命令行参数详解,Pythonui基础

程序媛可鸥

Python 程序员 面试

Python 使用 PyQt5 开发的关机小工具分享,为什么阿里的程序员成长如此之快

程序媛可鸥

Python 程序员 面试

python DataFrame数据格式化(设置小数位数,百分比,Python常用面试题

程序媛可鸥

Python 程序员 面试

Python 三十个实践、建议和技巧,各种风格的Python面试题进来了解一下

程序媛可鸥

Python 程序员 面试

VuePress 博客之 SEO 优化(四) Open Graph protocol

冴羽

Vue 前端 vuepress SEO 博客搭建

DDD 实战(5):战略设计之上下文映射和系统分层架构

深清秋

DDD 软件架构 生鲜电商系统 3月月更

Kafka 常用命令总结,给Python程序员的一些面试建议

程序媛可鸥

Python 程序员 面试

图文详解:阿里宠儿【小兔】RabbitMQ的养成攻略

浅羽技术

Java RabbitMQ 中间件 消息队列 RabbitMQ延时队列

一文读懂网关中间件-Nginx

Linux服务器开发

nginx 中间件 api 网关 Linux服务器开发 Linux后台开发

首届实时渲染3D动画创作大赛最佳人气奖?你说了算!

3DCAT实时渲染

3D 虚幻引擎 实时渲染 ue

三高Mysql - Inndb存储引擎和索引介绍

懒时小窝

MySQL innodb MySQL InnoDB

Python 深度集成的神器级 IDE,从此告别Excel!,成为阿里P7Python架构师到底有多难

程序媛可鸥

Python 程序员 面试

即时通讯(IM)开源项目OpenIM每周迭代版本发布-音视频实时通话-v2.0.4

Geek_1ef48b

Python 基础教程:动态类型模型,超通俗解析

程序媛可鸥

Python 程序员 面试

百度希壤元宇宙平台上线首个汽车数字展厅,领克探索汽车营销新方式

百度大脑

Python 基础教程:动态类型模型(1),阿里巴巴Python面试题答案

程序媛可鸥

Python 程序员 面试

Flutter 封装文本输入框

岛上码农

flutter 跨平台 Android开发 3月月更

测试开发【Mock平台】02基础:Java Spring Boot框架知识

MegaQi

测试工具 测试发开 测试平台开发教程

2022 ARTS|Week 11

MiracleWong

算法 写作 ARTS 打卡计划

你的 vscode 配置真的舒服么?

道道里

python pandas库统计分析基础必备知识汇总,2021Python网络编程总结篇

程序媛可鸥

Python 程序员 面试

【C语言】 扫雷游戏(保姆级的实现过程)

謓泽

3月月更

kudu参数优化设置,让集群飞起来~,2021年Python开发陷入饱和

程序媛可鸥

Python 程序员 面试

Python 实现七大排序算法,Python中高级面试必知必会

程序媛可鸥

Python 程序员 面试

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