CloudKit统计记录

问题描述 投票:13回答:2

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

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一起给出一个count或results数组,但不幸的是它没有。

有没有其他方法来计算表中的行数?

swift ios8 cloudkit
2个回答
9
投票

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

operation.resultsLimit = CKQueryOperationMaximumResults;

该物业的文件说:

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

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


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您可以忽略通过CKRecord CKQueryOperation返回的所有recordFetchedBlock实例并简单地增加您自己的NSUInteger计数器。在我的测试中,调用recordFetchedBlock的总次数始终与预期的查询结果数相匹配。

另外,为了效率,你可以使用desiredKeysCKQueryOperation属性来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。

© www.soinside.com 2019 - 2024. All rights reserved.