我目前正在开发一个 iOS Messenger 应用程序,我想谈谈这两个类的关系:MessengerConversation
和MessengerMessage
.
假设我已经有一个本地 MessengerConversation 实例,它可以有许多与其messages
关系属性相关的 MessengerMessage 实例,我想请求并映射以下 JSON 有效负载:
请求:GET /conversations/:conversationID/msgs
响应:
{
"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)?
最好的问候,
皮瓦