如果结果限制小于1000,为什么我的CKQueryOperation只返回一个Cursor?

问题描述 投票:0回答:1

CloudKit有大约2000条我试图下载的记录。我不能让他们全部下载,我看着CloudKit CKQueryOperation doesn't get all records获得超过100个结果。现在我可以下载到999,但如果我将结果限制设置为1000或更高,它将在80-500之间随机失败。我是否需要将这些条目拆分为不同的记录类型?

private func checkForCloudData() {
    let query = CKQuery(recordType: "myRecordType", predicate: .init(value: true))
    let op = CKQueryOperation(query: query)

    op.qualityOfService = .userInitiated
    op.queuePriority = .veryHigh
    op.resultsLimit = 999

    op.recordFetchedBlock = { record in
        // fetched record
    }

    op.queryCompletionBlock =  { cursor, err in

        if cursor != nil {
            print(cursor!)

            self.performOperation(withOperation: CKQueryOperation(cursor: cursor!))
        }

        if err == nil {
            // handle complete download
        } else {
            if (err as! CKError).code == .limitExceeded {
                if cursor != nil {
                    self.performOperation(withOperation: CKQueryOperation(cursor: cursor!))
                    return
                }
                let newOperation = CKQueryOperation(query: query)
                newOperation.resultsLimit = op.resultsLimit
                newOperation.queuePriority = .veryHigh
                newOperation.qualityOfService = .userInitiated
                newOperation.recordFetchedBlock = op.recordFetchedBlock
                newOperation.queryCompletionBlock = op.queryCompletionBlock

                self.performOperation(withOperation: newOperation)
            }
        }

    }

    self.performOperation(withOperation: op)
}

private func performOperation(withOperation operation: CKQueryOperation) {
        publicDB.add(operation)
}
swift cloudkit ckquery ckqueryoperation
1个回答
0
投票

我相信400是单个操作的限制,所以你需要使用游标来获取更多记录,并继续这样做,而返回的游标不是nil

看看它是如何在RxCloudKit库'RecordFetcher - https://github.com/maxvol/RxCloudKit/blob/master/RxCloudKit/RecordFetcher.swift中完成的

© www.soinside.com 2019 - 2024. All rights reserved.