I have this code that saves records into CloudKit in iOS in an iPhone 8 Simulator, but not all records are there when I check the database after the save code succeeds in saving 688 records whether 'maxNumberOfRecordsToModify' equal 50 or 400. I am sure I did everything correctly.
let privateDatabase = CKContainer.default().privateCloudDatabase
let maxNumberOfRecordsToModify = 400
func save(_ records: [CKRecord]) {
if iCloudAvailable() {
if records.count > maxNumberOfRecordsToModify {
let sliceOfRecords = Array(records[0 ..< maxNumberOfRecordsToModify])
let leftOverRecords = Array(records[maxNumberOfRecordsToModify ... records.count - 1])
let operation = CKModifyRecordsOperation(recordsToSave: sliceOfRecords, recordIDsToDelete: nil)
operation.savePolicy = CKModifyRecordsOperation.RecordSavePolicy.allKeys
operation.qualityOfService = QualityOfService.userInitiated
operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
if error == nil {
print("Batch saved records!")
save(leftOverRecords)
} else {
if let err = error as? CKError, let time = err.retryAfterSeconds {
print(err)
DispatchQueue.main.asyncAfter(deadline: .now() + time) {
save(sliceOfRecords)
}
} else {
print(error!)
}
}
}
privateDatabase.add(operation)
} else {
let operation = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: nil)
operation.savePolicy = CKModifyRecordsOperation.RecordSavePolicy.allKeys
operation.qualityOfService = QualityOfService.userInitiated
operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
if error == nil {
print("Batch saved records!")
printNumberOfRecords()
} else {
if let err = error as? CKError, let time = err.retryAfterSeconds {
print(err)
DispatchQueue.main.asyncAfter(deadline: .now() + time) {
save(records)
}
} else {
print(error!)
}
}
}
privateDatabase.add(operation)
}
}
}
func printNumberOfRecords() {
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: DatabaseNameStrings.recordTypeAffirmation, predicate: predicate)
privateDatabase.perform(query, inZoneWith: nil) {
(records: [CKRecord]?, error: Error?) in
if error != nil {
print(error as Any)
} else {
if let records = records {
print("Number of records in CloudKit=", records.count)
}
}
}
}
Here is the debug window output:
Batch saved records!
Batch saved records!
Number of records in CloudKit= 32