就是这种情况 - 我正在使用一个简单的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 的作用是将对象添加到表视图用作dataSource的可变数组中。
我是CloudKit的新手,我很困惑,这是设计的(不是所有的结果,而是一些随机的)或者我做错了什么?
答案 0 :(得分:1)
我看到你正在使用光标。因为第二次通话将在第一次通话结束时开始。您的resultsLimit为15.使用游标时,如果有超过15条记录,则只会在第二次执行查询时收到记录。要测试这是否是问题,只需注释掉设置光标的行:operation = CKQueryOperation(cursor:lastCursor)
答案 1 :(得分:0)
我发现了这个问题,我试图做(在NSPredicate中)一个半径,我读到的某个值以千米为单位。因此,我试图查询500米而不是500公里内的记录,我在模拟器中使用的GPX文件有多个距离较大的记录。由于它模拟了运动,因此不能获得一致的结果。
现在,当我使用适当的半径值时,似乎一切都很好!