0

我遵循了几个关于从 CloudKit 获取问题的 CKQueryOperation 示例/叙述。我的表有大约 370 行和 8 列。我最多只能获取大约 60 行。resultsLimit 参数似乎没有帮助。我的 queryCompletionBlock 没有执行。有时我获取 5 行,其他时间 30+ 来自云的响应现在很快所有行这一定是一些新手代码错误!

func getData() {
    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: RemoteFunctions.RemoteRecords.booksDB, predicate: predicate)
    let cloudContainer = CKContainer.default()
    let privateDatabase = cloudContainer.privateCloudDatabase
    let operation = CKQueryOperation(query: query)

    operation.queuePriority = .veryHigh
    operation.resultsLimit = 20

    operation.recordFetchedBlock = { (record: CKRecord) in
        self.allRecords.append(record)
         print(record)
    }
    operation.queryCompletionBlock = {[weak self] (cursor: CKQueryCursor?, error: NSError?) in
        // There is another batch of records to be fetched
        print("completion block called with \(String(describing: cursor))")

        if let cursor = cursor  {
            let newOperation = CKQueryOperation(cursor: cursor)
            newOperation.recordFetchedBlock = operation.recordFetchedBlock
            newOperation.queryCompletionBlock = operation.queryCompletionBlock
           newOperation.resultsLimit = 10
            privateDatabase.add(newOperation)
            print("more records")
        }
            // There was an error
        else if let error = error {
            print("Error:", error)
        }

            // No error and no cursor means the operation was successful
        else {
            print("Finished with records:")
        }
        } as? (CKQueryCursor?, Error?) -> Void

// privateDatabase.add(操作)

}
4

2 回答 2

4

你可以试试这个...

func getData(withCursor cursor: CKQueryCursor? = nil)
    {
    let cloudContainer = CKContainer.default()
    let privateDatabase = cloudContainer.privateCloudDatabase

    let operation: CKQueryOperation

    if let cursor = cursor
    {
        operation = CKQueryOperation(cursor: cursor)
    }
    else
    {
        let operation_configuration: CKOperationConfiguration = CKOperationConfiguration()
        operation_configuration.isLongLived = true
        operation_configuration.qualityOfService = .background

        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: RemoteFunctions.RemoteRecords.booksDB, predicate: predicate)

        operation = CKQueryOperation(query: query)
        operation.queuePriority = .veryHigh
        operation.configuration = operation_configuration


        operation.recordFetchedBlock = { (record: CKRecord) in
            self.allRecords.append(record)
                print(record)
        }

        operation.queryCompletionBlock = {[weak self] (cursor: CKQueryCursor?, error: NSError?) in
            // There is another batch of records to be fetched
            print("completion block called with \(String(describing: cursor))")

            if let error = error 
            {
                print("Error:", error)
            }
            else if let cursor = cursor  
            {
                self.getData(withCursor: cursor)
            }
            else
            {
                print("Finished with records:")
            }
        }
    }

    privateDatabase.add(operation)
}

这是使用新API的函数的递归版本。CKQueryOperation

当光标到达时,您似乎正在失去对操作对象的引用。

于 2018-03-20T08:07:26.600 回答
0

删除as? (CKQueryCursor?, Error?) -> Void近端。小心不要移除前面的支架。

删除newOperation.resultsLimit = 10光标块。

operation = newOperation直接在上面添加privateDatabase.add(newOperation)

取消注释privateDatabase.add(operation)

那应该有帮助。大提取,其中游标块被命中超过 3 次可能会出现问题。如果你做到了以上,你应该没问题。有些人喜欢编写/调用游标块作为自己的功能。这也有效,但没有必要。

于 2018-03-19T14:37:29.367 回答