Должны ли мы кэшировать 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 отдельно.