2012-10-06 111 views
0

我正在使用RestKit 0.10.3從我的自定義Web服務請求新消息。RestKit RKObjectLoader結果對象計數問題

我有所有的對象和映射工作正常,但我面臨一個單一的服務器請求(一個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 
    } 
    ] 
} 

此刻,一切運行良好,並結果可以通過返回objectsRKObjectLoader回撥訪問:

[objects count] == 5

但請求大五歲的消息相同的API後,一個不期望的結果顯示:

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]現在等於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有效載荷映射的對象?

我想我錯過了一些東西,但我無法弄清楚。

在此先感謝。

皮瓦

+0

你是否爲mapper設置'primaryKeyAttribute'? – gdavis

+0

嗨@gdavis並感謝您的評論。是的,我設置了所有實體'primaryKeyAttribute'。所有的映射過程都正常工作,只有結果是意外的(它返回了定義爲請求的'targetObject'的對話內的所有消息)。更新我在對話內插入消息的方式解決了我的問題。 – georgepiva

回答

0

我可以只更新,我將加載MessengerConversation對象的內部MessengerMessage實例的方式解決這個問題。

代替使用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上的一些問題。