Is there any limit to the result of a query to Cloudkit private default zone? I have no clue why I only receive first 100 records with the following query:<
I have updated GuiSoySauce's code in Swift 4.2.
func cloudKitLoadRecords(result: @escaping (_ objects: [CKRecord]?, _ error: Error?) -> Void) {
// predicate
var predicate = NSPredicate(value: true)
// query
let cloudKitQuery = CKQuery(recordType: "recordType", predicate: predicate)
// records to store
var records = [CKRecord]()
//operation basis
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
// recurrent operations function
var recurrentOperationsCounter = 101
func recurrentOperations(cursor: CKQueryCursor?){
let recurrentOperation = CKQueryOperation(cursor: cursor!)
recurrentOperation.recordFetchedBlock = { (record:CKRecord!) -> Void in
print("-> cloudKitLoadRecords - recurrentOperations - fetch \(recurrentOperationsCounter)")
recurrentOperationsCounter += 1
records.append(record)
}
recurrentOperation.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) -> Void in
if ((error) != nil) {
print("-> cloudKitLoadRecords - recurrentOperations - error - \(String(describing: error))")
result(nil, error)
} else {
if cursor != nil {
print("-> cloudKitLoadRecords - recurrentOperations - records \(records.count) - cursor \(cursor!.description)")
recurrentOperations(cursor: cursor!)
} else {
print("-> cloudKitLoadRecords - recurrentOperations - records \(records.count) - cursor nil - done")
result(records, nil)
}
}
}
publicDatabase.add(recurrentOperation)
}
// initial operation
var initialOperationCounter = 1
let initialOperation = CKQueryOperation(query: cloudKitQuery)
initialOperation.recordFetchedBlock = { (record:CKRecord!) -> Void in
print("-> cloudKitLoadRecords - initialOperation - fetch \(initialOperationCounter)")
initialOperationCounter += 1
records.append(record)
}
initialOperation.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) -> Void in
if ((error) != nil) {
print("-> cloudKitLoadRecords - initialOperation - error - \(String(describing: error))")
result(nil, error)
} else {
if cursor != nil {
print("-> cloudKitLoadRecords - initialOperation - records \(records.count) - cursor \(cursor!.description)")
recurrentOperations(cursor: cursor!)
} else {
print("-> cloudKitLoadRecords - initialOperation - records \(records.count) - cursor nil - done")
result(records, nil)
}
}
}
publicDatabase.add(initialOperation)
}
Usage
cloudKitLoadRecords() { (records, error) -> Void in
if let error = error {
// do something
} else {
if let records = records {
// do something
} else {
// do something
}
}
}