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 と共にカウントまたは結果の配列を提供することを望みますが、残念ながらそうではありません。

テーブル内の行数を計算する他の方法はありますか?

4

2 に答える 2

9

いいえ、クエリに一致するレコードの総数を取得することはできません。また、結果を列挙することによって、答えが間違っている可能性があります。CloudKit によって返されるレコードの数は固定されていません。CloudKit には、返すレコードの数を決定するメカニズムがあります。これを CKQueryOperation オブジェクトで固定数に設定することができます。デフォルトは次のとおりです。

operation.resultsLimit = CKQueryOperationMaximumResults;

このプロパティのドキュメントには、次のように記載されています。

その値を使用する場合、サーバーは、それらのレコードを受信する際の遅延を最小限に抑えながら、できるだけ多くのレコードを返す最適な数の結果を提供することを目的とした制限を選択します。ただし、一定数の結果を処理することがわかっている場合は、それに応じてこのプロパティの値を変更してください。

カウントがこの固定数と同じである場合、おそらくクエリよりも多くのレコードが返されます。

于 2014-07-23T12:47:18.323 に答える
4

クエリに一致するレコードの総数を非反復的な方法で取得することはできませんが、反復的に行うことは可能です。

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プロパティを使用して を使用できます。source: desiredKeysソース ファイル内のコメントには、CKQueryOperationlimit the amount of data retrieved for each record during the search operationCKQueryOperation.hIf set to an empty array, declares that no user fields should be downloaded.

上記のシナリオをテストして、CKQueryOperation何百ものレコードを正常にカウントしたため、デフォルトのCKQueryOperationMaximumResultsバッチ制限である 100 を超えました。

于 2019-02-16T10:12:53.663 に答える