Нормально ли в конечном итоге получить много изменений в 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.