0

カスタム Web サービスからの新しいメッセージを要求するために、RestKit 0.10.3を使用しています。

すべてのオブジェクトとマッピングが正常に機能していますが、サーバー (RKObjectLoader インスタンス) に対して行われた 1 回の要求によって返されるオブジェクトの数に関する問題に直面しています。

と等しいプロパティ値を持ち、内部に何もないMessengerConversationオブジェクトがあるとします (これは空の会話です)。conversationID1MessengerMessage

最初に、カスタム Web サービスから 5 つの新しいメッセージを要求しました。

GET /messenger/conversations/1/messages/?maxmsgcount=5

次のような JSON ペイロードが返されました。

{
  "messages": [
    {
      "content": "A new message.",
      "messageid": 10
    },
    {
      "content": "A new message.",
      "messageid": 9
    },
    {
      "content": "A new message.",
      "messageid": 8
    },
    {
      "content": "A new message.",
      "messageid": 7
    },
    {
      "content": "A new message.",
      "messageid": 6
    }
  ]
}

現時点では、すべてが正常に機能し、コールバックobjectsから返された によって結果にアクセスできました。RKObjectLoader

[objects count] == 5

しかし、同じ API に対して古い 5 つのメッセージを要求した後、望ましくない結果が表示されます。

GET /messenger/conversations/1/messages/?maxmsgcount=5&msgsbeforeid=6

次のような JSON ペイロードを返します。

{
  "messages": [
    {
      "content": "A new message.",
      "messageid": 5
    },
    {
      "content": "A new message.",
      "messageid": 4
    },
    {
      "content": "A new message.",
      "messageid": 3
    },
    {
      "content": "A new message.",
      "messageid": 2
    },
    {
      "content": "A new message.",
      "messageid": 1
    }
  ]
}

問題は、受信した JSON ペイロードに返されたメッセージの数ではなく、 [objects count]which が等しいことです。105

objectsこのように、配列には参照された会話内のすべてのメッセージが含まれているため、最新の返された JSON ペイロードから最大および最小のメッセージ ID を追跡することは不可能です。

Printing description of objects:
<__NSArrayM 0xa720a40>(
<MessengerMessage: 0xa721560> (entity: MessengerMessage; id: 0xa7021c0 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p1> ; data: <fault>),
<MessengerMessage: 0x13360490> (entity: MessengerMessage; id: 0x133605a0 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p2> ; data: <fault>),
<MessengerMessage: 0x13360510> (entity: MessengerMessage; id: 0xa7023a0 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p3> ; data: <fault>),
<MessengerMessage: 0x13360550> (entity: MessengerMessage; id: 0xa7022b0 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p4> ; data: <fault>),
<MessengerMessage: 0xa720290> (entity: MessengerMessage; id: 0xa702080 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p5> ; data: <fault>),
<MessengerMessage: 0xa71ca40> (entity: MessengerMessage; id: 0x13360cf0 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p6> ; data: <fault>),
<MessengerMessage: 0x12f96c40> (entity: MessengerMessage; id: 0xa7023f0 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p7> ; data: <fault>),
<MessengerMessage: 0x133603c0> (entity: MessengerMessage; id: 0x13360b10 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p8> ; data: <fault>),
<MessengerMessage: 0x13360380> (entity: MessengerMessage; id: 0x13360c00 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p9> ; data: <fault>),
<MessengerMessage: 0xa720700> (entity: MessengerMessage; id: 0x13360a20 <x-coredata://569C8DF6-D912-4DFF-B5A2-C462F0355B3F/MessengerMessage/p10> ; data: <fault>)
)

マッピングの問題により、コメント付きのすべてのリクエストを次の設定で構成しています。

[objectManager loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) {
    loader.targetObject = [MessengerConversation findByPrimaryKey:query.conversationID];
    ...
}];

RKObjectLoader最新の受信 JSON ペイロードからマップされたオブジェクトのみを返すようにすることは可能ですか?

私は何かが欠けていると思いますが、それを理解することはできません。

前もって感謝します。

ピバ

4

1 に答える 1

0

MessengerMessageロードされたインスタンスをMessengerConversationオブジェクト内に挿入する方法を更新するだけで、この問題を修正できました。

RKObjectLoader'targetObject'プロパティを使用して、どの会話ロードメッセージから開始したかを定義する代わりに、 RKObjectLoaderDelegate'objectLoader:willMapData:'メソッドを使用して、conversationidロードされた各メッセージにキーを手動で挿入し始めました。

次に、MessengerMessage次のコマンドを処理するために、カスタムマッピングプロバイダーへのマッピングを別の方法で設定します。

[objectMappingMessage mapKeyPath:@"conversationid" toAttribute:@"conversationID"];
[objectMappingMessage hasOne:@"conversation_" withMapping:objectMappingConversation];
[objectMappingMessage connectRelationship:@"conversation_" withObjectForPrimaryKeyAttribute:@"conversationID"];

(現在のJSONペイロードから)ロードされたメッセージのみがobjectsRKObjectLoaderコールバックから配列に返されるようになりました。

また、IRCに関する私の質問に答えてくれた@blakewattersに感謝します。

于 2012-10-06T18:32:33.170 に答える