最近项目中需要拓展一下已经定义好的实例字段,同时原本的实例是支持l iCoud 同步的,新增加实力(Entity)字段后,我们的预期是「老版本升级上来的用户能正常使用,同时还能正常进行 iCloud 同步」,即用户对字段升级毫无感知。
这篇文章就介绍技术实现的具体细节。
这里还是用 Student 学生这个实例来举例子,原始有 age, name, school 三个属性,我们希望新增一个分数 score 的属性。
最近项目中需要拓展一下已经定义好的实例字段,同时原本的实例是支持l iCoud 同步的,新增加实力(Entity)字段后,我们的预期是「老版本升级上来的用户能正常使用,同时还能正常进行 iCloud 同步」,即用户对字段升级毫无感知。
这篇文章就介绍技术实现的具体细节。
这里还是用 Student 学生这个实例来举例子,原始有 age, name, school 三个属性,我们希望新增一个分数 score 的属性。
这篇笔记是介绍使用 CoreData+TableView 中使用差量数据源(Diffable Datasource)。使用差量数据源的起因是,在 CoreData+TableView+iCloud 使用过程中遇到的一个 Crash 的问题。经常在同步的时候遇到下面这个崩溃报错:
** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete item 4 from section 0 which only contains 4 items before the update' terminating with uncaught exception of type NSException
这篇笔记主要是介绍 TableView+CoreData+iCloud 同步的技术细节。之前的笔记已经介绍过如何在工程和代码中配置 CloudKit 同步了,这里不再赘述。
CoreData 数据同步的具体流程其实官方文档说的比较清楚,登录了同样 iCloud 账号的 A、B 设备,系统会自动发送和接收内容改变,我们并不需要在工程上添加设备代码。具体流程
这篇笔记主要是介绍 CoreData 和 TableView 一起使用时候的方法。
使用 CoreData 应用中有很多列表展示的场景底层数据需要读取本地数据,我以前的做法并没有遵循官方文档的做法使用 NSFetchedResultsController 这个类去进行数据管理,而是我自己通过 CoreData 的 API 去读写数据,自己管理 UITableView 刷新的,其实是维护了两份数据源,一份内存中的数据,一份本地的数据,当用户插入数据的时候先通过 CoreData 将数据插入本地,然后再插入内存。这样管理非常费劲,而且在后面加入 iCloud 同步的时候会面临什么时候将本地数据加载入内存中这样的问题。看了官方文档之后才知道有更好的做法,于是变更了自己使用 CoreData+UITableview 的方式,使用官方推荐的 API NSFetchedResultsController 来做列表数据管理。
这篇笔记主要是参考苹果官方文档的配置流程来介绍 CoreData 如何配置支持 CloudKit,按步骤介绍一下整体的流程
在创建工程的时候勾选使用 CoreData,以及 Host in iCloud,这样会在初始化 CoreData Stack 的时候直接使用 NSPersistentCloudKitContainer 进行初始化,NSPersistentCloudKitContainer 是 NSPersistentContainer 子类,提供了管理 CloudKit 支持的存储和非云端的存储。
这篇文章主要是介绍如何在 CoreData 中使用多个 Context(本文中提到的 Context 都指的是 NSManagedContext)
CoreData 并不是线程安全的,如果不额外创建线程的话 CoreData 就是一直在主线程运行的。但是有一些情况是需要额外创建线程去进行 CoreData 操作。这时候就要格外注意 NSManagedObject, NSManagedObjectContext 和 NSPersistentStoreCoordinator 这些类并不是线程安全的,对这些类的实例的操作应该只在创建这些实例的线程上下文中去进行。所以在多线程(Concurrency)和多个 Context 操作我理解是同一个话题。
这篇文章主要是总结一些常见的 CoreData 的操作。
我们先定义数据结构如下,这里我们的数据结构对应代码的生成方式是 Xcode 自动生成的,看图右侧的 Class → Codegen 部分。
对于每个属性还有更细致的设置,比如如果你不想要某个属性持久化,而是临时使用,可以设置属性为 Transient,等这部分详细的说明就不多说了可以参考官方文档 Configuring Attributes
这篇笔记主要是介绍一些 CoreData 的基本概念。Core Data 是苹果提供的数据持久化方案。相对于 Sqlite,CoreData 提供了原生的 ORM 的支持,以及可以和苹果的 Cloud 服务进行通信,对于独立开发者来说,这是成本很低的数据存储方案,目前也是很多开发者使用的技术栈。
Core Data 我自己感觉稍微有一定的使用门槛,不过苹果这几年也在不断地降低CoreData API 和相关概念的使用和理解难度,这部分的技术储备还是要进行的。
我尝试从 CoreData Stack 这里开始理清 CoreData 相关的比较难理解的概念。事实上也就 CoreData Stack 这里比较难理解。