服务器记录中的CKAsset不包含fileURL,甚至不能检查nil

时间:2016-12-10 05:29:56

标签: swift cloudkit ckasset ckerror

当我使用CKAsset保存包含CKModifyRecordsOperation(仅仅是JPG图像)且保存策略为.IfServerRecordUnchanged的记录时,我正在测试同步冲突。我收到错误CKErrorCode.ServerRecordChanged。这个CKError返回了解决冲突的有用信息,包括我试图保存的CKRecord以及记录的当前服务器版本。第一个是error.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,服务器缺少“#path”路径'属性。

  

客户端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 =已上传,wrappedEncryptionKey =,signature =< 0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>

     

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

注意服务器中缺少path=~/tmp/C706423B-A3E8-4051-A9B3-483C718BFBF5photo的一个?有谁能解释一下?为了解决这个问题,我尝试避免从服务器记录中触摸CKAsset。我想至少能够检查零。我想把它放在那里,以防它帮助其他人。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

CKAsset的{​​{1}}媒体资源中访问serverRecord时,我在iOS 11.2.1上遇到此问题。这有点令人沮丧。解决方法是通过CKRecord再次获取对象,然后访问func fetch(withRecordID...

答案 2 :(得分:0)

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

CloudKit通知您您的 write 操作失败,因为您未使用最新的CKRecord进行操作,并为您提供了服务器当前CKRecord的非水合版本,因此您可以确定哪些字段与您的起点。其余的取决于您。

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

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