Должны ли мы кэшировать CKServerChangeToken в CKDatabase и CKRecordZone отдельно?

В моем приложении я использую 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 метод Sto хранить значение CKServerChangeToken?

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

Swift 3, Xcode 9

1 ответ

Решение

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

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

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

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