【问题标题】:CloudKit count recordsCloudKit 计数记录
【发布时间】:2014-08-03 05:26:43
【问题描述】:

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

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 一起提供一个计数或结果数组,但不幸的是它没有。

还有其他方法可以计算表格的行数吗?

【问题讨论】:

  • 您可能想在 Apple 开发者论坛上提问。我认为根据 Apple 开发者协议,这些信息仍然是保密的。
  • 很遗憾,关于 CloudKit 的讨论并不多。

标签: ios swift ios8 cloudkit


【解决方案1】:

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

operation.resultsLimit = CKQueryOperationMaximumResults;

该属性的文档说:

使用该值时,服务器会选择一个限制,旨在提供最佳数量的结果,从而返回尽可能多的记录,同时最大限度地减少接收这些记录的延迟。但是,如果您知道要处理固定数量的结果,请相应地更改此属性的值。

如果您的计数与此固定数字相同,则可能有比您返回的查询更多的记录。

【讨论】:

  • 有时在使用这个常量时(顺便说一下是 0)我得到错误
  • 有时如果说你请求 1000 并且它失败了,如果你然后使用光标和 100 的限制来获得所有 1000。如果你然后尝试再次获得所有 1000,那么它成功!因此,如果记录在缓存中,服务器必须进行缓存并允许更大的限制。
【解决方案2】:

不可能以非迭代方式获得与查询匹配的记录总数,但可以迭代

CKQueryOperation 将允许您获取查询的所有可能结果,但是,可能只能通过多个后续操作:If the search yields many records, the operation object may deliver a portion of the total results to your blocks immediately, along with a cursor for obtaining the remaining records.source: CKQueryOperation 您可以忽略通过CKQueryOperation@987654327 返回的所有CKRecord 实例@ 并简单地增加你自己的 NSUInteger 计数器。在我的测试中,调用recordFetchedBlock 的总次数始终与预期的查询结果数相匹配。

另外,为了提高效率,您可以使用CKQueryOperationdesiredKeys 属性来转换limit the amount of data retrieved for each record during the search operationsource: desiredKeys CKQueryOperation.h 源文件中的注释表明 If set to an empty array, declares that no user fields should be downloaded.

我使用CKQueryOperation 成功计算了数百条记录来测试上述场景,因此高于默认的CKQueryOperationMaximumResults 批量限制100。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多