4

当我使用保存策略保存包含CKAsset(只是 JPG 图像)的记录时,我正在测试同步冲突 我收到错误消息。这将为我返回解决冲突的有用信息,包括我尝试保存的信息以及记录的当前服务器版本。第一个在,第二个在。CKModifyRecordsOperation.IfServerRecordUnchangedCKErrorCode.ServerRecordChangedCKErrorCKRecorderror.userInfo[CKRecordChangedErrorClientRecordKey]error.userInfo[CKRecordChangedErrorServerRecordKey]

我的问题是我正在尝试使用以下代码访问服务器记录的 CKAsset:

if let photoAsset = rec["myPhoto"] as? CKAsset {
  print("PhotoAsset.fileURL: \(photoAsset.fileURL)")  // BAD_ACCESS ERROR HERE
  self.myPartner.photo = NSData(contentsOfURL: photoAsset.fileURL)
}

我不明白这怎么可能。但经过进一步调查,我打印出客户端和服务器 CKRecords,而服务器缺少“路径”属性。

客户端 CKAsset...myPhoto (修改) -> CKAsset: 0x7b960d90; path=~/tmp/BF185B2C-7A39-4730-9530-9797E843243Aphoto, size=373959, uploadRank=0, uploadReceipt=A92Eg1qoyPG7yrg3, UUID=3C2D5DC8-4FF5-4A81-853B-395FC1C59862, referenceSignature=<012fd149 200fc600 617e3907 88763e3e 5002abbf 5b> , flags=uploaded, WrappedEncryptionKey=, signature=<0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>

服务器 CKAsset...myPhoto = CKAsset: 0x7be700d0; referenceSignature=<015337bd 84409893 7c014f46 36248d27 ce911dc3 7a>, size=373959, uploadRank=0, UUID=DF5D2EB4-033C-49A2-AF52-6055B5A44106, wrappedEncryptionKey=<767e7cfd d1e62110 32119ee9 f6f026b3 5bcf0cc3 8053a4de>, signature=<0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>

请注意服务器一号是如何path=~/tmp/C706423B-A3E8-4051-A9B3-483C718BFBF5photo丢失的?谁能解释一下?为了解决这个问题,我尽量避免接触服务器记录中的 CKAsset。我希望至少能够检查零。我想把它放在那里,以防它帮助其他人。

4

3 回答 3

0

由于访问时崩溃fileURL,这很可能是一个框架错误。CKRecord可能是因为被埋在字典里的疏忽。我只是定期跟进fetch(withRecordID:)

于 2017-10-26T15:26:02.120 回答
0

CKAsset从. _ serverRecord_ CKRecord这有点令人沮丧。一种解决方法是再次通过func fetch(withRecordID...然后访问获取对象fileURL

于 2018-01-02T15:34:07.847 回答
0

这似乎是正确的行为,而不是错误。

CloudKit 通知您您的写入操作失败,因为您没有使用最新的 CKRecord,并为您提供了服务器当前 CKRecord 的非水合版本,因此您可以确定哪些字段与您的起点不同。剩下的就看你了。

如果 CloudKit 在写入操作的错误响应中返回完全水合的服务器记录,则可能会浪费大量带宽/资源。

这就是 CKAssets 存在的原因:将与 CKRecord 关联的大小受限的键值字段与可以附加到它们的无限大小的二进制资产分开。

于 2020-01-03T17:29:29.343 回答