我有一张"表"这可能有很多记录,当添加新记录时,我需要知道当前表中已有多少记录,因为我在计算某些值时使用它。我能找到的最接近的是请求所有这样的条目:
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数组,但不幸的是它没有。
有没有其他方法可以计算表格中的行数?
答案 0 :(得分:9)
不,无法获得符合您查询的记录总数。同样通过枚举结果,答案可能是错误的。 CloudKit返回的记录数量不固定。 CloudKit有一种机制来决定返回多少记录。可以在CKQueryOperation对象上将其设置为固定数字。默认值为:
operation.resultsLimit = CKQueryOperationMaximumResults;
该物业的文件说:
使用该值时,服务器会选择一个限制,旨在提供尽可能多的记录的最佳结果数,同时最大限度地减少接收这些记录的延迟。但是,如果您知道要处理固定数量的结果,请相应地更改此属性的值。
如果您的计数与此固定数字相同,则可能会有比您的查询返回的记录更多的记录。
答案 1 :(得分:1)
不可能以非迭代的方式获得与查询匹配的记录总数,但是可以迭代进行。
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
的总次数始终与预期的查询结果次数匹配。
此外,为了提高效率,可以使用desiredKeys
的{{1}}属性来CKQueryOperation
。 limit the amount of data retrieved for each record during the search operation
源文件中的source: desiredKeys注释指出CKQueryOperation.h
我用If set to an empty array, declares that no user fields should be downloaded.
成功计数了数百条记录,从而超过了默认的CKQueryOperation
批处理限制100。