限制 CloudKit 中返回的结果数量

Posted

技术标签:

【中文标题】限制 CloudKit 中返回的结果数量【英文标题】:Limit the amount of results returned in CloudKit 【发布时间】:2015-01-01 03:38:41 【问题描述】:

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

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

执行新搜索:

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)

【讨论】:

我读过类似的东西,但我可以选择前 5 个值,然后通过新操作跳过前 5 个值并选择接下来的 5 个吗?跨度> 我已经更新了答案(给我五分钟)。这有点不切实际,因为它取了五个,然后立即又取了五个。您可能希望在用户滚动后获取接下来的五个。 好的,谢谢,我只调用一次,然后在需要加载下5个时添加新操作? 正确 - 确保“新操作”使用“旧操作”的完成处理程序中的 CKQueryCursor qop = newQop 至关重要。没有它我无法让它工作:qop 在过程中的某个时刻会变成nil,并且获取将是不完整的......

以上是关于限制 CloudKit 中返回的结果数量的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit 返回太多记录

CloudKit 批量获取?

CloudKit 私有数据库返回前 100 个 CKRecords

如何限制 Sybase 中返回的结果数量?

如何限制从 NSMetadataQuery 返回的结果数量?

CloudKit 查询与 modifyDate 始终返回无结果