CKQuery from private zone returns only first 100 CKRecords from in CloudKit

前端 未结 5 1876
遇见更好的自我
遇见更好的自我 2020-12-03 08:19

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:<

5条回答
  •  佛祖请我去吃肉
    2020-12-03 08:58

    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
            }
        }
    }
    

提交回复
热议问题