前言
好记忆不如烂笔记!还是很有道理的,特别是像我这样的中年大叔。
随意记录关于CloudKit的知识点吧,毕竟这东西,用得少,也忘得快!
只记录一些概念性的东西,具体代码不放,毕竟我都写完了。
CloudKit概要
一个CKContainer, 多个App可以配置使用同一个。
三个CKDatabase,分别为私有库privateCloudDatabase, 公有库publicCloudDatabase, 共享库sharedCloudDatabase。
public和private数据库默认存在一个叫_defaultZone。
每个CKDatabase可以有多个CKRecordZone
每个CKRecordZone可以存在多个CKRecord
记录分区Zone
在本地设备操作并保存到服务器。
CKRecordZone,记录分区,分区可以更快的进行搜索。里面可以保存不同的记录类型,也就是文档中说的record type
CKModifyRecordZonesOperation 对CKRecordZone进行保存或删除操作。 CKFetchRecordZonesOperation 用于获取CKRecordZone信息
注意: 只有私有数据库才能创建自定义CKRecordZone。只有自定义的Zone,才能用于共享(sharedCloudDatabase)!自定义Zone对数据的处理更有效,毕竟不用搜索整个数据库!而且支持更多功能,比如:原子操作,订阅,共享等
CKReference 只能在同一区域内使用
建议: 存在在私有数据库中的记录,都使用自定义Zone吧。虽然存在默认的Zone,但就当它不存在就好。
记录Record
CKRecord,一条记录的对象。
CKModifyRecordsOperation 用来保存或删除CKRecord。
CKFetchRecordsOperation 获取指定的记录信息。
CKQuery配合CKQueryOperation 查询记录。
CKQueryCursor 游标,当查询的记录过多时,可以使用它来获取下一页记录
官方文档中说的record type,可以当成是类名,
令牌Token
CKServerChangeToken 一个不透明的Token,记录数据库变化令牌。使用NSKeyedArchiver来保存。
CKFetchDatabaseChangesOperation 只有私有与共享库支持此操作,获取整个数据库中所有记录分区Zone的变化
CKFetchRecordZoneChangesOperation 只有私有与共享库支持此操作,获取指定Zone中有变化的Reocrd。
注意: 一般就是在适当的时机,将本地缓存的Token发送到服务器,服务器告诉你那些数据要更新,并发送最新的Token给你,将数据进行更新后,缓存本此Token。传递Token为nil时,表示获取所有变化。
Database的Token与Zone的Token不要混淆了,它们是不一样的。
Database是取有变化的Zone,Zone是取有变化的Record。
订阅
CKDatabaseSubscription 订阅整个数据库的变化,只支持私有与共享数据库。对应的通知为CKDatabaseNotification。每一个要取得通知的设备,都要保存一次,后续那怕重装后不订阅,也可以接受到通知。设置recordType时,若设置无效,则fetchAllSubscriptionsOperation将出错!
CKRecordZoneSubscription 订阅私有数据库上指定Zone的变化,只支持私有库。对应的通知为CKRecordZoneNotification
CKQuerySubscription 根据给定的NSPredicate来订阅,只支持公有库与私有库。对应的通知为CKQueryNotification
CKFetchSubscriptionsOperation 获取订阅信息
注意: 每种订阅方式都有相应的Notification
订阅产生的通知,可能会被系统合并。所以最可靠的是使用fetch操作来取得数据。比如使用Token。
不要使用模拟器来做订阅的测试,必须使用真机!
记录的外置文件
CKAsset 当CKRecord中某个字段的字节数比较大时(几千字节),使用此类来做存储。
记录关联
CKReference 两个CKRecord的关系。
CloudKit错误处理
对于网络操作,优化考虑错误处理!否则上线后,人一多就有得烦了。 CKErrorRequestRateLimited,CKErrorServiceUnavailable,CKErrorZoneBusy,CKErrorNetworkFailure等这几个错误可能碰到的情况比较多,建议在程序时进行处理,一般就是稍后重试(在回调中稍等,重新调用)