0

我正在使用RestKit 0.10.3从我的自定义 Web 服务中请求新消息。

我的所有对象和映射都正常工作,但我面临一个关于向服务器发出的单个请求(RKObjectLoader 实例)返回的对象数量的问题。

假设我有一个MessengerConversation对象,它的conversationID属性值等于1,但MessengerMessage里面没有(这是一个空对话)。

最初,我从我的自定义 Web 服务中请求了五个新消息:

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
    }
  ]
}

问题在于[objects count]which 现在等于10而不是5作为接收到的 JSON 有效负载中返回的消息数。

这样,就不可能从最新返回的 JSON 有效负载中跟踪最大和最小的消息 ID,因为该objects数组包含引用对话内的所有消息。

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 有效负载)objects从 RKObjectLoader 回调返回到数组中。

另外,感谢@blakewatters 努力回答我在 IRC 上的一些问题。

于 2012-10-06T18:32:33.170 回答