ios - CloudKit 中的记录不能超过 100 条

标签 ios swift cloudkit ckrecord ckqueryoperation

我尝试了很多不同的方法来获取记录,并在 stackoverflow 上检查了相同的问题,但无法获取超过 100 条记录。

之前,我使用 CKQuery 而不是 CKQueryOperation 来使用 resultsLimit 参数。

这是我的代码:

    func initData(){
        // show activity indicator
        self.activityIndicatorView.hidden = false
        // hide connection error button
        self.connectionErrorButton.hidden = true

        let container = CKContainer.defaultContainer()
        let publicDB = container.publicCloudDatabase

        let predicate = NSPredicate(value: true)
        let sort = NSSortDescriptor(key: "id", ascending: true)

        var newInfo = Array<CKRecord>()

        let query = CKQuery(recordType: "info", predicate:  predicate)
        query.sortDescriptors = [sort]

        let queryOperation = CKQueryOperation(query: query)
        queryOperation.queuePriority = .VeryHigh
        queryOperation.resultsLimit = 150;

        // Fetch the pokemons for the record
        func fetched(record: CKRecord!) {
            newInfo.append(record)
        }

        queryOperation.recordFetchedBlock = fetched

        queryOperation.queryCompletionBlock = { [unowned self] (cursor, error) in
            if (error != nil) {
                dispatch_async(dispatch_get_main_queue()) {
                    self.connectionErrorButton.hidden = false
                    self.activityIndicatorView.hidden = true
                    return
                }
            } else {
                dispatch_async(dispatch_get_main_queue()) {
                    self.infos.removeAll()
                    self.infos = newInfo
                    self.tableView.reloadData()
                    self.activityIndicatorView.hidden = true
                    return
                }
            }
        }
        publicDB.addOperation(queryOperation)
    }

最佳答案

在 iOS 9.3 及以下版本中,您需要使用 CKQueryCursor 执行多个提取操作并跟踪您在提取中的位置。那是在完成 block 中传回的游标对象,您可以用它创建另一个操作,它将像这样从您离开的地方开始:

queryOperation.queryCompletionBlock = { (cursor, error) in
    if let cursor = cursor {
         let cursorOperation = CKQueryOperation(cursor: cursor)
         cursorOperation.queryCompletionBlock = //Handle it again
    }
    //Do stuff
}

在使用游标时,您通常会希望制作可重用的处理程序 block ,这样您就可以在多个游标到达时递归地创建基于游标的查询操作。

关于ios - CloudKit 中的记录不能超过 100 条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38869240/

相关文章:

ios - 为什么我不能引用在Swift项目的同一目录中创建的类或结构?

swift - Swift 中 AnyClass 的 Dart 表示是什么

swift - 'if (let keychain = KeychainService.loadToken())' 给我一个预期的声明错误

ios - 我如何限制cloudkit中给出的结果数量

ios - Cordova iOS - 如何更改最低部署版本?

iphone - 如何为大型数据集创建 UITableView 索引

ios - Sprite-Kit 中的按钮按下动画

ios - 数组在本应明确包含元素时为空

ios - 无法将 Realm 与 iCloud 同步

ios - 禁用 CloudKit 调试日志