云套件计数记录

17

我有一张“表”,可能会有很多记录。当我添加新记录时,需要知道当前表中已有多少记录,因为我会在某些值的计算中使用它。我能找到的最接近的方法是像这样请求所有条目:

var query : CKQuery = CKQuery(recordType: "Stars", predicate: NSPredicate(format: "mass > 0"))
    var request : CKQueryOperation = CKQueryOperation(query: query)
    var starCount = 0

    request.queryCompletionBlock = {
        (cursor:CKQueryCursor!, error:NSError!) in
        if error {
            completionHandler(ECOResponse.error(error.description), starCount)
        } else {
            completionHandler(ECOResponse.ok(), starCount)
        }
    }

    request.recordFetchedBlock = {
        (record:CKRecord!) in
        starCount += 1
    }

我希望queryCompletionBlock能够在返回CKQueryCursor的同时提供结果数量或结果数组,但不幸的是它没有这样做。

除此之外还有其他计算表中行数的方法吗?


您可能想要在苹果开发者论坛上询问此问题。我认为根据苹果开发者协议,这些信息仍然是私有的。 - Rob Segal
很不幸,那里关于CloudKit的讨论并不多。 - Dennis Sedov
2个回答

9

不,无法获取符合您查询条件的总记录数。同时通过枚举结果可能会得到错误答案。CloudKit 返回的记录数是不固定的。CloudKit 有一个机制来决定返回多少条记录。可以在 CKQueryOperation 对象上将其设置为固定数字。默认值为:

operation.resultsLimit = CKQueryOperationMaximumResults;

这个属性的文档说:
当使用该值时,服务器会选择一个限制,旨在提供尽可能多的记录并最小化接收这些记录的延迟。然而,如果您知道您想要处理一定数量的结果,相应地更改此属性的值。
如果您的数量与此固定数字相同,则可能有比您的查询返回的记录更多的记录。

2
有时候在使用这个常数(顺便说一下,它的值是0)时,我会得到以下错误:<CKError 0x16d31690: "无效参数" (12/1020); "您的请求包含超过单个请求中的最大项目数(400)"> - malhal
3
有时如果您请求1000条数据失败,您可以使用游标和100条限制来获取所有1000条数据。如果您再次尝试一次性获取全部1000条数据,则此时请求成功!因此,服务器必须对缓存中的记录允许更大的限制,并且可以缓存数据。 - malhal

4

无法以非迭代方式获取与查询匹配的记录总数,但可以通过迭代方式实现。

CKQueryOperation 将允许您获取查询的所有可能结果,但可能仅通过多个后续操作: 如果搜索产生许多记录,则操作对象可能立即通过游标向您的块传递部分总结果和获取剩余记录的游标。source: CKQueryOperation 您只需忽略通过CKQueryOperationrecordFetchedBlock返回的所有CKRecord实例,并简单地增加自己的NSUInteger计数器。在我的测试中,recordFetchedBlock被调用的次数总是与预期的查询结果数量相匹配。

此外,为了提高效率,您可以使用CKQueryOperationdesiredKeys属性,以限制在搜索操作期间检索每个记录的数据量source: desiredKeys CKQueryOperation.h源文件中的注释指出:如果设置为空数组,则声明不应下载任何用户字段。

我使用CKQueryOperation测试了上述场景,成功计数了数百条记录,因此超过了默认的CKQueryOperationMaximumResults批处理限制100条。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接