2012-07-13 29 views
1

我目前正在開發一個iOS Messenger應用程序,我想談談這兩個類的關係:MessengerConversationMessengerMessageRestKit使用指定的主鍵引用在默認關係中映射對象

假設我已經有可以有相關到其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)?

最好的問候,
皮瓦

回答

4

你不需要這種方法。當您啓動RKObjectLoader時,將您的Conversation對象設置爲targetObject並進行相對於此對象的映射。例如:

RKManagedObjectMapping* cMapping = [RKManagedObjectMapping mappingForClass: [MessengerConversation class]]; 
RKManagedObjectMapping* mMapping = [RKManagedObjectMapping mappingForClass: [MessengerMessage class]]; 

//Configure mappings 

[cMapping mapKeyPath: @"messages" toRelationship: @"messages" withObjectMapping: mMapping]; 

[mappingProvider setMapping cMapping forKeyPath: @""]; 
+1

Hi Paul, 首先,感謝您的回答。它糾正了我的錯誤,並教會了我一種新的方法。但是,在改變你提出的建議之後,我開始收到以下錯誤:**添加映射錯誤:無法將對象集合映射到不可變集合上。意外的目標對象類型'MessengerConversation'**作爲測試,我在MessengerConversation類中實現了三個方法:addObject,removeObject,containsObject,只是重定向到它的messages屬性,再次工作。是否有可能以更好的方式解決它? – georgepiva 2012-07-13 18:53:45

+2

我有同樣的問題。你的JSON負載是否包含對話 - >消息數據? RestKit如何知道如果在有效載荷處存在對話密鑰,則將每條消息映射到父對話? – angelokh 2012-07-13 20:13:55

+0

我的意思是如果在有效載荷處沒有對話密鑰? – angelokh 2012-07-13 20:21:29