限制CloudKit中返回的结果数量

时间:2015-01-01 03:38:42

标签: ios swift cloudkit ckquery

有没有办法限制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

1 个答案:

答案 0 :(得分:9)

您将CKQuery提交给CKQueryOperationCKQueryOperation包含cursorresultsLimit的概念;它们将允许您捆绑查询结果。如文档中所述:

  

要执行新搜索:

     

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)