有没有办法限制CKQuery
中返回的结果数量?
在SQL
中,可以运行SELECT * FROM Posts LIMIT 10,15
之类的查询。是否有类似查询的最后部分,CloudKit中的LIMIT 10,15
?
例如,我想加载前5个结果,然后,一旦用户向下滚动,我想加载接下来的5个结果,依此类推。在SQL中,它将是LIMIT 0,5
,然后是LIMIT 6,10
,依此类推。
有一件事是使用for
循环,但它会非常密集,因为我必须从iCloud中选择所有值,然后循环遍历它们以找出哪个5到选择,我预计数据库中会有很多不同的帖子,所以我只想加载那些需要的帖子。
我正在寻找类似的东西:
var limit: NSLimitDescriptor = NSLimitDescriptor(5, 10)
query.limit = limit
CKContainer.defaultContainer().publicCloudDatabase.addOperation(CKQueryOperation(query: query)
//fetch values and return them
答案 0 :(得分:9)
您将CKQuery
提交给CKQueryOperation
。 CKQueryOperation
包含cursor
和resultsLimit
的概念;它们将允许您捆绑查询结果。如文档中所述:
要执行新搜索:
1)使用包含的CKQuery对象初始化CKQueryOperation对象 您想要的记录的搜索条件和排序信息。
2)将一个块分配给queryCompletionBlock属性,以便您可以 处理结果并执行操作。
如果搜索产生许多记录,则操作对象可以传递a 总结果的一部分立即到你的块,同时a 用于获取剩余记录的游标。如果提供了光标, 用它来初始化和执行一个单独的CKQueryOperation对象 当你准备好处理下一批结果时。
3)可选择通过指定值来配置返回结果 resultsLimit和desiredKeys属性。
4)将查询操作对象传递给的addOperation:方法 目标数据库,以对该数据库执行操作。
所以看起来像:
var q = CKQuery(/* ... */)
var qop = CKQueryOperation (query: q)
qop.resultsLimit = 5
qop.queryCompletionBlock = { (c:CKQueryCursor!, e:NSError!) -> Void in
if nil != c {
// there is more to do; create another op
var newQop = CKQueryOperation (cursor: c!)
newQop.resultsLimit = qop.resultsLimit
newQop.queryCompletionBlock = qop.queryCompletionBlock
// Hang on to it, if we must
qop = newQop
// submit
....addOperation(qop)
}
}
....addOperation(qop)