2

複数のレコード タイプで更新/挿入/削除を受信できるように、CKQueryNotification を CKRecord または CKSubscription に接続する方法が必要です。CKNotifications を正常に受信しています。これがペイロードです。

{
    ck =     {
        ce = 2;
        cid = "<my cloud container id>";
        nid = "<unknown guid>";
        qry =         {
            dbs = 2;
            fo = 1;
            rid = "<the record id>";
            sid = "<THIS IS THE SUBSCRIPTION ID>";
            zid = "_defaultZone";
            zoid = "_defaultOwner";
        };
    };
}

通知ペイロードによってサブスクリプション ID を取得でき、サブスクリプション ID をレコードの種類を認識しているローカル キャッシュに関連付けることができますが、CKFetchNotificationChangesOperation を使用して未読の通知を取得したいと考えており、その時点では CKQueryNotification オブジェクトしかありません。 .

CKQueryNotification オブジェクトには CKRecordID しかありません。私が知る限り、CKRecordID から CKRecord を取得することはできません。コンテナ内のすべての CKRecord->recordType に対してクエリを実行できましたが、それは正しくないようです。

どんな助けでも大歓迎です!

4

1 に答える 1

6

プッシュ通知を受け取った場合は、それを CKQueryNotification にキャストできるかどうかを確認する必要があります。実際、完全なレコードを取得するには、-[CKDatabase fetchRecordWithID:completionHandler:] を呼び出す必要があります。その後、.recordType を使用して、それがどのような種類のレコードであるかを確認できます。

同じ recordType に対して複数のサブスクリプションがある場合にのみ問題が発生します。オブジェクトがそのサブスクリプションに使用した述語に準拠しているかどうかを確認することで、これを解決できます。これについては、predicate.evaluateWithObject メソッドを参照してください。CKReference の述語がある場合、これは使用できません。

これの実際のサンプルが必要な場合は、 https ://github.com/evermeer/EVCloudKitDao を参照してください。 これには、CKRecord との間の自動解析や結果のデバイスでのキャッシュなどの優れた機能がいくつかあります。

于 2015-02-04T08:41:26.073 に答える