限制 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
提交给CKQueryOperation
。 CKQueryOperation
具有 cursor
和 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)
【讨论】:
我读过类似的东西,但我可以选择前 5 个值,然后通过新操作跳过前 5 个值并选择接下来的 5 个吗?跨度> 我已经更新了答案(给我五分钟)。这有点不切实际,因为它取了五个,然后立即又取了五个。您可能希望在用户滚动后获取接下来的五个。 好的,谢谢,我只调用一次,然后在需要加载下5个时添加新操作? 正确 - 确保“新操作”使用“旧操作”的完成处理程序中的CKQueryCursor
qop = newQop
至关重要。没有它我无法让它工作:qop
在过程中的某个时刻会变成nil
,并且获取将是不完整的......以上是关于限制 CloudKit 中返回的结果数量的主要内容,如果未能解决你的问题,请参考以下文章
CloudKit 私有数据库返回前 100 个 CKRecords