2015-04-14 6 views
3
<CKError 0x14d8cb70: "Partial Failure" (2/1011); "Failed to modify some records"; partial errors: { 
    B5DEF0B5-F064-4B27-9C89-BE75C9134297:(_defaultZone:__defaultOwner__) = <CKError 0x14d83b70: "Server Record Changed" (14/2037); "Error saving record <CKRecordID: 0x15748cd0; B5DEF0B5-F064-4B27-9C89-BE75C9134297:(_defaultZone:__defaultOwner__)> to server: Protection data didn't match"> 
}> 

Я получаю эту ошибку, когда пытаются сохранить CKRecord s до CloudKit ошибки. Есть идеи?CloudKit: сохранение записи с CKModifyRecordsOperation

Должен ли я получать первые записи, например, в API удобства?

Я использую метод CKModifyRecordsOperation для обновления большего количества записей.

ответ

5

Когда вы планируете делать обновление, вам сначала нужно прочитать запись, внести изменения, а затем записать запись. Вы получили уведомление о том, что запись была изменена за время между чтением и записью записи.

Если версия записи на сервере более новая, чем версия, которую вы пытались сохранить, сервер возвращает ошибку CKErrorServerRecordChanged. Словарь userInfo объекта ошибки содержит разные версии конфликтующих записей. Используйте эти ключи для извлечения записей и для выполнения любой логики разрешения для разрешения конфликта.

Как обсуждалось ниже в вашем случае проблема заключалась в том, что вы сохраняли объект в базе данных и воссоздавали CKRecord, чтобы выполнить эту модификацию. В этом случае вам необходимо сохранить системные поля, используя CKRecord encodeSystemFieldsWithCoder. И воссоздайте CKRecord, инициализируя его с помощью NSCoder. Вы можете использовать NSKeyedArchiver и NSKeyedUnarchiver для сохранения CKRecord и воссоздания его. Если вам нужен образец, см. Методы fromCKRecord и toCKRecord внизу https://github.com/evermeer/EVCloudKitDao/blob/master/AppMessage/AppMessage/CloudKit/EVCloudKitDao.swift

+1

для 1 записи это нормально, но для обновления 100-х записей, это серьезно, мне нужно сначала загрузить, найти, какой из них изменять и загружать? brbrbr –

+0

Вам не обязательно их читать. см. мой обновленный ответ. Так что просто сохраните их все и повторите попытку обновления, когда вы получите сообщение об ошибке, используя идентификатор записи внутри ошибки. –

+2

Вы можете использовать '- [CKRecord encodeSystemFieldsWithCoder:]' для кодирования только системных полей (например, тега изменения) для записи. Вы можете позже разблокировать запись только с помощью системных полей, применить только те изменения, которые вы хотите сохранить на сервере, и сохранить запись. Если вы уже держите локальную базу данных записей, которые должны сохранить вас в оба конца на сервер. – farktronix

Смежные вопросы