CKAsset в записи сервера не содержит fileURL, даже не может проверить на ноль

Я тестирую конфликт синхронизации при сохранении записи, содержащей CKAsset (просто изображение в формате JPG), используя CKModifyRecordsOperation с политикой сохранения .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; путь =~/tmp/BF185B2C-7A39-4730-9530-9797E843243Aphoto, размер =373959, uploadRank=0, uploadReceipt=A92Eg1qoyPG7yrg3, UUID=3C2D5DC8-4FF5-4A81-853B-395FC2b5e6506508506-e-595, flags=uploaded, wrappedEncryptionKey=, signature=<0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>

сервер CKAsset...myPhoto = CKAsset: 0x7be700d0; referenceSignature=<015337bd 84409893 7c014f46 36248d27 ce911dc3 7а>, размер =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 из записи сервера. Я хотел бы, по крайней мере, иметь возможность проверить на ноль. Я хотел показать это на случай, если это поможет кому-то еще.

2 ответа

Из-за сбоя при доступе fileURLэто скорее всего ошибка в фреймворке. Вероятно, упущение в связи с CKRecord быть похороненным в словаре. Я просто следую за этим с регулярным fetch(withRecordID:),

Я также испытываю эту проблему на iOS 11.2.1 при доступе CKAsset от serverRecord недвижимость в CKRecord, Это немного расстраивает. Обходной путь - получение объекта еще раз через func fetch(withRecordID... а затем доступ fileURL,

Это похоже на правильное поведение, а не на ошибку.

CloudKit сообщил вам, что ваша операция записи завершилась неудачно, потому что вы не работали с последней версией CKRecord, и предоставил вам негидратированную версию текущего CKRecord сервера, чтобы вы могли определить, какие поля отличаются от вашей начальной точки. Остальное зависит от тебя.

Если CloudKit вернет полностью гидратированную запись сервера в ответе об ошибке для операции записи, это потенциально приведет к потере огромного количества полосы пропускания / ресурсов.

Вот почему существуют CKAsset: для отделения полей "ключ-значение" с ограниченным размером, связанных с CKRecord, от двоичных ресурсов неограниченного размера, которые могут быть к ним прикреплены.

Другие вопросы по тегам