Я использую CloudKit в своем приложении и начал с того, что следую рекомендациям из видео WWDC «Лучшие практики CloudKit».
Первое, что нужно сделать, это проверить изменения, которые мне нравятся,
let changesOperation = CKFetchDatabaseChangesOperation(previousServerChangeToken: databaseChangeToken)
changesOperation.fetchAllChanges = true
changesOperation.recordZoneWithIDChangedBlock = { self.recordZoneWithIDChanged($0) }
changesOperation.recordZoneWithIDWasDeletedBlock = { self.recordZoneWithIDWasDeleted($0) }
changesOperation.changeTokenUpdatedBlock = { self.changeTokenUpdate($0) }
changesOperation.fetchDatabaseChangesCompletionBlock = { self.fetchDatabaseChangesCompletion($0, isMoreComing: $1, error: $2) }
privateDatabase.add(changesOperation)
В частной базе данных есть записи, для которых я настраиваю выборку, но я всегда получаю только changeTokenUpdatedBlock
и fetchDatabaseChangesCompletion
.
Прав ли я, говоря, что должен ожидать попадания в recordZoneWithIDChangedBlock
при выполнении этой операции и передачи зоны по умолчанию моей частной базы данных в этот блок?
Это означает, что когда я вызываю свой fetchDatabaseChangesCompletion
, мне нечего извлекать, потому что массив идентификаторов зон записи пуст: (обратите внимание, error
равен нулю)
fileprivate func fetchDatabaseChangesCompletion(_ newToken: CKServerChangeToken?, isMoreComing: Bool, error: Error?)
{
if let error = error
{
// Handle error
return
}
let fetchZoneChangesOperation = CKFetchRecordZoneChangesOperation(recordZoneIDs: changedRecordZoneIDs,
optionsByRecordZoneID: nil)
fetchZoneChangesOperation.recordChangedBlock = { self.recordChanged($0) }
fetchZoneChangesOperation.recordWithIDWasDeletedBlock = { self.recordWithIDWasDeleted($0, string: $1) }
fetchZoneChangesOperation.recordZoneFetchCompletionBlock = { self.recordZoneFetchCompletion($0, newChangeToken: $1, clientSentChangeTokenData: $2, isMoreComing: $3, error: $4) }
fetchZoneChangesOperation.completionBlock = { self.fetchRecordZoneChangesCompletion() }
privateDatabase.add(fetchZoneChangesOperation)
}