Должны ли мы кэшировать CKServerChangeToken в CKDatabase и CKRecordZone отдельно? - PullRequest
0 голосов
/ 06 сентября 2018

В моем приложении я использую CloudKit и личную CKDatabase пользователя для хранения записей. Я делаю выборки для изменений, когда приложение запускается, как было рекомендовано на WWDC 2016.

Во-первых, я вызываю метод fetchDatabaseChanges(database: CKDatabase, databaseTokenKey: String, completion: @escaping () -> Void). Внутри этого метода в changesOperation.fetchDatabaseChangesCompletionBlock я сохраняю CKServerChangeToken в userDefaults для ключа: ckDatabaseToken.

Я также вызываю fetchZoneChanges(database: database, databaseTokenKey: databaseTokenKey, zoneIDs: changedZoneIDs, completion в changesOperation.fetchDatabaseChangesCompletionBlock метода fetchDatabaseChanges.

В методе fetchZoneChanges есть operation.recordZoneFetchCompletionBlock. Внутри этого блока нам также нужно сохранить значение токена в UserDefaults. И я сохраняю его в другой переменной ckZoneToken в настройках по умолчанию Поэтому внутри fetchZoneChanges я получаю и сохраняю (из / в UserDefaults) значение ckZoneToken, а внутри fetchDatabaseChanges я получаю и сохраняю (из / в UserDefaults) значение ckDatabaseToken.

Это правильная техника? Или лучше использовать только одну переменную в методах fetchDatabaseChanges и fetchZoneChanges для хранения значения CKServerChangeToken?

Какой подход будет наилучшим?

Swift 3, Xcode 9

1 Ответ

0 голосов
/ 07 сентября 2018

Я экспериментировал с обоими способами и выяснил, что, если мы используем один changeToken в пользовательских значениях по умолчанию, мы получим ошибку «Неверные данные продолжения синхронизации».

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

Итак, я думаю, что мы должны кэшировать CKServerChangeToken как в CKDatabase, так и в CKRecordZone отдельно.

...