1

就是这种情况——我正在使用一个简单的 UITableView 来呈现来自 CloudKit publicDB 的记录。当我运行该应用程序时,查询操作返回例如返回 2 个结果(这就是它目前的全部)。

我的表格视图有一个刷新控件,当我拉动刷新时,我得到零结果,如果我继续重新加载,最终可能会出现结果,但现在总是。

同样的事情也会发生更多的结果,我曾经有我查询过的 CKLocation 类型,并且响应总是不同的,没有任何常识

一些示例代码(本例中的谓词是 TRUEPREDICATE - 没什么特别的):

    let sort = NSSortDescriptor(key: "creationDate", ascending: false)        
    let query = CKQuery(recordType: "Tests", predicate: DiscoveryMode.getPredicate())
    query.sortDescriptors = [sort]

    var operation = CKQueryOperation(query: query)
    if lastCursor != nil {
        operation = CKQueryOperation(cursor: lastCursor)
    }

    operation.resultsLimit = 15
    operation.recordFetchedBlock = recordFetchBlock
    operation.queryCompletionBlock = { [weak self] (cursor:CKQueryCursor!, error:NSError!) in

        if cursor != nil {
             self!.lastCursor = cursor
        }

        dispatch_async(dispatch_get_main_queue(), { () -> Void in

            Misc.hideLoadingInView(view: self!.view)

            self!.tableView.reloadData()
            self!.refreshControl.endRefreshing()

            if error != nil {
                Misc.showErrorInView(view: self!.view, message: error.localizedDescription)
            }
        })
    }

    CloudKit.sharedInstance.publicDB.addOperation(operation)

recordFetchBlock所做的只是将对象添加到表视图用作数据源的可变数组中。

我是 CloudKit 的新手,我很困惑这是设计使然(不是返回所有结果,而是返回一些随机结果)还是我做错了什么?

4

2 回答 2

1

我看到您正在使用光标。因此,第二次通话将从第一次通话结束的地方开始。您的 resultsLimit 为 15。使用游标时,如果记录超过 15 条,您将仅在第二次执行查询时收到记录。要测试这是否是问题,只需注释掉设置光标的行: operation = CKQueryOperation(cursor: lastCursor)

于 2015-06-30T09:06:21.177 回答
0

我发现了这个问题,我试图(在 NSPredicate 中)一个半径,我在某处读取的值以公里为单位。因此,我试图查询 500 米而不是 500 公里内的记录,并且我在模拟器中使用的 GPX 文件有多个距离较远的记录。由于它模拟运动,这就是无法获得一致结果的原因。

现在,当我使用适当的半径值时,一切似乎都很好!

于 2015-07-01T06:47:17.190 回答