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

问题描述 投票:3回答:2

当我使用带有CKAsset保存策略的CKModifyRecordsOperation保存包含.IfServerRecordUnchanged(只是JPG图像)的记录时,我正在测试同步冲突。我收到错误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 =,签名= <0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>

server CKAsset ... myPhoto = CKAsset:0x7be700d0; referenceSignature = <015337bd 84409893 7c014f46 36248d27 ce911dc3 7A>,大小= 373959,uploadRank = 0,UUID = DF5D2EB4-033C-49A2-AF52-6055B5A44106,wrappedEncryptionKey = <767e7cfd d1e62110 32119ee9 f6f026b3 5bcf0cc3 8053a4de>,签名= <0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 D3>

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

swift cloudkit ckasset ckerror
2个回答
0
投票

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


0
投票

当我从CKAssetserverRecord属性访问CKRecord时,我在iOS 11.2.1上也遇到了这个问题。这有点令人沮丧。解决方法是再次通过func fetch(withRecordID...获取对象,然后访问fileURL

© www.soinside.com 2019 - 2024. All rights reserved.