当我使用带有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。我想至少能够检查零。我想把它放在那里,以防它帮助其他人。
由于访问fileURL
时崩溃,这很可能是一个框架错误。可能是由于CKRecord
被埋在字典中而导致的疏忽。我只是用常规的fetch(withRecordID:)
跟进。
当我从CKAsset
的serverRecord
属性访问CKRecord
时,我在iOS 11.2.1上也遇到了这个问题。这有点令人沮丧。解决方法是再次通过func fetch(withRecordID...
获取对象,然后访问fileURL
。