Нормально ли в конечном итоге получить много изменений в CKFetchRecordChangesOperation?

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

CKFetchRecordChangesOperation *fetchRecordChangesOperation = [[CKFetchRecordChangesOperation alloc] initWithRecordZoneID:zoneID previousServerChangeToken:NIL];

Я получаю МНОГО изменений, так как все предыдущие удаления и изменения, похоже, синхронизируются.

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

1 ответ

Если посмотреть на документацию CKServerChangeToken, похоже, что вы можете получить ее только при использовании CKFetchRecordChangesOperation. См.: https://developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKServerChangeToken_class/index.html

Итак, как же вы можете получить этот токен?

Обычно вы делаете что-то вроде этого: Как вы можете видеть в CKFetchRecordChangesOperation Вы можете инициализировать его с previousServerChangeToken, Этот токен работает как метка времени. Когда операция завершится, вы получите этот токен обратно в fetchRecordChangesCompletionBlock, Вы должны сохранить этот токен, например, по умолчанию для пользователя. Тогда в следующий раз вы начнете CKFetchRecordChangesOperationВы можете использовать этот токен, чтобы начать читать изменения с момента последнего вызова.

На самом деле сохранение токена может быть немного сложнее. Я могу предложить добавить свойство как это:

private var previousChangeToken: CKServerChangeToken? {
    get {

        let encodedObjectData = NSUserDefaults.standardUserDefaults().objectForKey("\(container.containerIdentifier)_lastFetchNotificationId") as? NSData
        var decodedData: CKServerChangeToken? = nil
        if encodedObjectData != nil {
            decodedData = NSKeyedUnarchiver.unarchiveObjectWithData(encodedObjectData!) as? CKServerChangeToken
        }
        return decodedData
    }
    set(newToken) {
        if newToken != nil {
            NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(newToken!), forKey:"\(container.containerIdentifier)_lastFetchNotificationId")
        }
    }
}

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

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