我目前正在開發一個iOS Messenger應用程序,我想談談這兩個類的關係:MessengerConversation
和MessengerMessage
。RestKit使用指定的主鍵引用在默認關係中映射對象
假設我已經有可以有相關到其messages
關係屬性許多MessengerMessage情況下,本地MessengerConversation情況下,我想請求並映射以下JSON有效載荷:
請求:GET /會話/:的conversationId /封郵件
響應:
{
"messages": [
{
...
"messageid": n,
"content": "..."
...
},
...
]
}
作爲響應JSON有效載荷並未指出哪個會話所遞送的消息是從。我用下面的方法來解決這個問題到我MessengerManager
類(負責與共享RKObjectManager實例交互):
- (void)objectLoader:(RKObjectLoader *)objectLoader willMapData:(inout id *)mappableData {
//
// GETs Resource Paths.
if ([objectLoader method] == RKRequestMethodGET) {
if ([pathMatcherConversationsMessagesGET matchesPath:objectLoader.resourcePath tokenizeQueryStrings:NO parsedArguments:Nil]) {
//
// Get requested conversationID from the following resource path Pattern:
// kMessengerManagerResourcePathMessages: /conversations/:conversationID/msgs
NSNumber *currentConversationID = Nil;
NSDictionary *arguments = Nil;
BOOL isMatchingPattern = [pathMatcherConversationsMessagesGET matchesPattern:kMessengerManagerResourcePathConversationsMessagesGET
tokenizeQueryStrings:YES
parsedArguments:&arguments];
if (isMatchingPattern) {
currentConversationID = [arguments objectForKey:@"conversationID"];
//
// Get the original returned array of messages:
NSArray *origMessagesArray = [*mappableData valueForKeyPath:@"messages"];
NSMutableArray *reformattedData = [NSMutableArray arrayWithCapacity:[origMessagesArray count]];
//
// Create copies of objects adding the already knew reference.
for (NSDictionary *origMessagesArrayObject in origMessagesArray) {
NSMutableDictionary *newMessagesArrayObject = [origMessagesArrayObject mutableCopy];
[newMessagesArrayObject setObject:currentConversationID forKey:@"conversationid"];
[reformattedData addObject:newMessagesArrayObject];
}
//
// Replace the new objects instead of the response objects
[*mappableData setObject:reformattedData forKey:@"messages"];
}
}
}
}
所以一切工作正常。也就是說,從指定的MessengerConversation(進入RKObjectLoader資源路徑)中加載的所有MessengerMessages都被插入到想要的關係中。
現在出現了真正的問題,因爲我正在使用採用RKObjectLoaderProtocol的MessengerManager類,所以我可以實現objectLoader:willMapData:
方法。但是,由於我的View類使用RKFetchedResultsTableController
,每個表控制器實例也是它的RKObjectLoader委託,我不知道在映射操作之前啓用RKFetchedResultsTableController實例更新接收的JSON負載的最佳實踐。
我應該繼承嗎?
是否有更好的方法將收到的對象映射到由RKObjectLoader資源路徑指定的預定義對象中(例如:GET/conversations/2/msg,其中所有結果消息應該映射到已定義的MessengerConversation對象內,鍵值等於2)?
最好的問候,
皮瓦
Hi Paul, 首先,感謝您的回答。它糾正了我的錯誤,並教會了我一種新的方法。但是,在改變你提出的建議之後,我開始收到以下錯誤:**添加映射錯誤:無法將對象集合映射到不可變集合上。意外的目標對象類型'MessengerConversation'**作爲測試,我在MessengerConversation類中實現了三個方法:addObject,removeObject,containsObject,只是重定向到它的messages屬性,再次工作。是否有可能以更好的方式解決它? – georgepiva 2012-07-13 18:53:45
我有同樣的問題。你的JSON負載是否包含對話 - >消息數據? RestKit如何知道如果在有效載荷處存在對話密鑰,則將每條消息映射到父對話? – angelokh 2012-07-13 20:13:55
我的意思是如果在有效載荷處沒有對話密鑰? – angelokh 2012-07-13 20:21:29