8

有什么方法可以限制 a 中返回的结果数量CKQuery吗?

SQL中,可以运行类似的查询SELECT * FROM Posts LIMIT 10,15LIMIT 10,15CloudKit中是否有类似查询的最后一部分的内容?

例如,我想加载前 5 个结果,然后,一旦用户向下滚动,我想加载接下来的 5 个结果,依此类推。在 SQL 中,它会是LIMIT 0,5, then 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
4

1 回答 1

10

您将您的提交CKQueryCKQueryOperation. CKQueryOperationcursor和 的概念resultsLimit;它们将允许您捆绑查询结果。如文档中所述:

要执行新搜索:

1) 使用 CKQuery 对象初始化 CKQueryOperation 对象,该对象包含您想要的记录的搜索条件和排序信息。

2)为queryCompletionBlock属性分配一个块,以便您可以处理结果并执行操作。

如果搜索产生许多记录,则操作对象可能会立即将总结果的一部分传递给您的块,以及用于获取剩余记录的游标。如果提供了一个游标,当您准备好处理下一批结果时,使用它来初始化和执行一个单独的 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)
于 2015-01-01T05:57:54.900 回答