gpt4 book ai didi

icloud - 我如何(以及何时)在 CKRecord 上使用 iCloud 的 encodeSystemFields 方法?

转载 作者:行者123 更新时间:2023-12-04 00:10:59 25 4
gpt4 key购买 nike

encodeSystemFields当我在数据库中本地保存记录时应该使用。

一旦我导出了该数据,在反序列化它时我是否必须做一些特殊的事情?

我应该在哪些情况下根据该数据中的信息采取行动?

作为一个变体(如果上一个问题没有涵盖),这些信息可以帮助我防范什么? (我假设数据损坏)

最佳答案

encodeSystemFields 有助于避免再次从 CloudKit 获取 CKRecord 来更新它(除非记录冲突)。
这个想法是:
当您为从 CloudKit 检索的记录存储数据时 (例如,通过 CKFetchRecordZoneChangesOperation 检索以将记录更改同步到本地存储):
1.) 将 CKRecord 存档到 NSData:

let record = ...

// archive CKRecord to NSData
let archivedData = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWithMutableData: archivedData)
archiver.requiresSecureCoding = true
record.encodeSystemFieldsWithCoder(with: archiver)
archiver.finishEncoding()
2.) 将存档数据存储在本地(例如,在您的数据库中)与您的本地记录相关联。
当你想把对本地记录所做的更改保存回 CloudKit :
1.) 从您存储的 NSData 中解压 CKRecord:
let archivedData = ... // TODO: retrieved from your local store

// unarchive CKRecord from NSData
let unarchiver = NSKeyedUnarchiver(forReadingWithData: archivedData)
unarchiver.requiresSecureCoding = true
let record = CKRecord(coder: unarchiver)
2.) 使用未归档的记录作为更改的基础。 (即在其上设置更改的值)
record["City"] = "newCity"
3.) 通过 CKModifyRecordsOperation 将记录保存到 CloudKit。

为什么?
来自苹果:

Storing Records Locally

If you store records in a local database, use the encodeSystemFields(with:) method to encode and store the record’s metadata. The metadata contains the record ID and change tag which is needed later to sync records in a local database with those stored by CloudKit.


当您在 CloudKit 中保存对 CKRecord 的更改时,您需要保存更改 到服务器的记录 .
您不能只是创建一个具有相同记录 ID 的新 CKRecord,在其上设置值,然后保存它。如果这样做,您将收到“服务器记录已更改”错误 - 在这种情况下,这是因为现有服务器记录包含您的本地记录(从头创建)丢失的元数据。
所以你有两个选择来解决这个问题:
  • 从 CloudKit 请求 CKRecord(使用 recordID),对该 CKRecord 进行更改,然后将其保存回 CloudKit。
  • 使用 编码系统字段 ,并将元数据存储在本地,将其解压缩以创建一个“基础”CKRecord,该CKRecord 具有所有适当的元数据,用于将所述CKRecord 的更改保存回CloudKit。

  • #2 节省您的网络往返次数*。
    *假设另一台设备在此期间没有修改记录——这也是这些数据可以帮助您防范的。如果另一台设备在您上次检索它的时间和您尝试保存它的时间之间修改了记录,CloudKit 将(默认情况下)拒绝您的记录保存尝试,并显示“服务器记录已更改”。这是您以适合您的应用程序和数据模型的方式执行冲突解决的线索。 (通常,通过从 CloudKit 获取新的服务器记录并在再次尝试保存之前将适当的值更改重新应用于该 CKRecord。)
    注意:每当您向/从 CloudKit 保存/检索更新的 CKRecord 时,您必须记住更新您本地存储的存档 CKRecord。

    关于icloud - 我如何(以及何时)在 CKRecord 上使用 iCloud 的 encodeSystemFields 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39737190/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com