Skip to content

Instantly share code, notes, and snippets.

@cristibaluta
Last active April 23, 2017 10:50
Show Gist options
  • Save cristibaluta/3609cd852d0670fba090f3ba210b31f3 to your computer and use it in GitHub Desktop.
Save cristibaluta/3609cd852d0670fba090f3ba210b31f3 to your computer and use it in GitHub Desktop.
func queryUpdates (sinceDate: Date, completion: @escaping ([Task], [String], NSError?) -> Void) {
let changeToken = UserDefaults.standard.serverChangeToken
fetchChangedRecords(token: changeToken,
previousRecords: [],
previousDeletedRecordsIds: [],
completion: { (changedRecords, deletedRecordsIds) in
completion(self.tasksFromCKTasks(changedRecords), self.idsFromCKRecordIds(deletedRecordsIds), nil)
})
}
func fetchChangedRecords (token: CKServerChangeToken?,
previousRecords: [CKRecord],
previousDeletedRecordsIds: [CKRecordID],
completion: @escaping ((_ changedRecords: [CKRecord], _ deletedRecordsIds: [CKRecordID]) -> Void)) {
var changedRecords = previousRecords
var deletedRecordsIds = previousDeletedRecordsIds
let op = CKFetchRecordChangesOperation(recordZoneID: customZone.zoneID, previousServerChangeToken: token)
op.recordChangedBlock = { record in
changedRecords.append(record)
}
op.recordWithIDWasDeletedBlock = { recordID in
deletedRecordsIds.append(recordID)
}
op.fetchRecordChangesCompletionBlock = { serverChangeToken, data, error in
guard error == nil else {
completion(changedRecords, deletedRecordsIds)
return
}
UserDefaults.standard.serverChangeToken = serverChangeToken
if op.moreComing {
self.fetchChangedRecords(token: serverChangeToken,
previousRecords: changedRecords,
previousDeletedRecordsIds: deletedRecordsIds,
completion: completion)
} else {
completion(changedRecords, deletedRecordsIds)
}
}
privateDB.add(op)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment