2012-07-13 48 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