fatbobman / blogComments

1 stars 0 forks source link

Core Data with CloudKit(三)—— CloudKit 仪表台 | 肘子的Swift记事本 #119

Open fatbobman opened 3 years ago

fatbobman commented 3 years ago

https://www.fatbobman.com/posts/coreDataWithCloudKit-3/

本篇文章中,我们将一起研究 CloudKit 仪表台。

FoneG commented 1 year ago

NSPersistentCloudKitContainer方案看下来有一点不理解。通过CKQueryOperation能主动拉取iCloud上的变更,但拿到的是CKRecord信息。客户端上怎么把它转化成对应的NSManagedObject,又不会让iCloud认为用户在修改数据呢?

fatbobman commented 1 year ago

NSPersistentCloudKitContainer方案看下来有一点不理解。通过CKQueryOperation能主动拉取iCloud上的变更,但拿到的是CKRecord信息。客户端上怎么把它转化成对应的NSManagedObject,又不会让iCloud认为用户在修改数据呢?

这正是 NSPersistentCloudKitContainer 所做的工作。Core Data 会在本地的 SQLite 数据库中创建很多新的表,在这些表中保存了每个 NSManagedObject 对应的 CKRecord ,CKRecord 的 token,最后同步的 token,哪些还没有上传成功等众多信息。它会自动在 NSManagedObject 和 CKRecord 中进行数据转换。 也就是说,当客户端的代码在修改本地的一个 NSManagedObject 实例,数据持久化后( save),NSPersistentCloudKitContainer 里面一个用来处理转换的线程会通过持久化历史跟踪的机制获得当前哪个数据被修改、添加、删除的信息,并生成对应数据转换操作。另一个用了同步的线程会根据转换后的数据进行对应的同步操作。 以上过程对使用者和开发者来说都是无感的。开发者只需要和以前一样操作本地数据即可。

FoneG commented 1 year ago

@fatbobman

NSPersistentCloudKitContainer方案看下来有一点不理解。通过CKQueryOperation能主动拉取iCloud上的变更,但拿到的是CKRecord信息。客户端上怎么把它转化成对应的NSManagedObject,又不会让iCloud认为用户在修改数据呢?

这正是 NSPersistentCloudKitContainer 所做的工作。Core Data 会在本地的 SQLite 数据库中创建很多新的表,在这些表中保存了每个 NSManagedObject 对应的 CKRecord ,CKRecord 的 token,最后同步的 token,哪些还没有上传成功等众多信息。它会自动在 NSManagedObject 和 CKRecord 中进行数据转换。 也就是说,当客户端的代码在修改本地的一个 NSManagedObject 实例,数据持久化后( save),NSPersistentCloudKitContainer 里面一个用来处理转换的线程会通过持久化历史跟踪的机制获得当前哪个数据被修改、添加、删除的信息,并生成对应数据转换操作。另一个用了同步的线程会根据转换后的数据进行对应的同步操作。 以上过程对使用者和开发者来说都是无感的。开发者只需要和以前一样操作本地数据即可。

感谢回复。推送可能会不及时,所以我想找到一个主动拉取变更数据的方法。在第五篇文章中您有提到通过对CKQurey的方式获取公共数据,可以用它来尝试“主动”拉取iCloud变更数据的吧。我困惑的就是拿到CKRecord数据后应该怎么处理,还是说有有办法交给NSPersistentCloudKitContainer处理呢?

fatbobman commented 1 year ago

感谢回复。推送可能会不及时,所以我想找到一个主动拉取变更数据的方法。在第五篇文章中您有提到通过对CKQurey的方式获取公共数据,可以用它来尝试“主动”拉取iCloud变更数据的吧。我困惑的就是拿到CKRecord数据后应该怎么处理,还是说有有办法交给NSPersistentCloudKitContainer处理呢?

我建议不要做类似的尝试。

FoneG commented 1 year ago

还望指教,第五篇文章说的“Core Data with CloudKit只能采用轮询方式(poll for changes)来获取公共数据库的变化数据。” 里面的获取变化数据,又是怎么实现的呢

fatbobman commented 1 year ago

还望指教,第五篇文章说的“Core Data with CloudKit只能采用轮询方式(poll for changes)来获取公共数据库的变化数据。” 里面的获取变化数据,又是怎么实现的呢

我没有具体研究其实现方式,苹果在 WWDC Session 中也指出,这是一个十分繁琐的操作,需要进行非常多的步骤。在下面的时间点,工程师简单介绍了轮询的操作,但没有具体的实现细节 https://developer.apple.com/videos/play/wwdc2020/10650/?time=694