私は現在iOSMessengerアプリケーションを開発しており、これら2つのクラスの関係について話したいと思いMessengerConversation
ますMessengerMessage
。
リレーションシッププロパティに関連付けられた多くのMessengerMessageインスタンスを持つことができるローカルMessengerConversationインスタンスがすでにあると仮定してmessages
、次の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リソースパスに)ロードされたすべてのMessengerMessageが、必要な関係に挿入されます。
ここで本当の問題が発生します。RKObjectLoaderProtocolを採用するMessengerManagerクラスを使用しているので、objectLoader:willMapData:
メソッドを実装できます。しかし、私のViewクラスはを使用してRKFetchedResultsTableController
おり、すべてのテーブルコントローラーインスタンスはそのRKObjectLoaderデリゲートでもあるため、マッピング操作の前にRKFetchedResultsTableControllerインスタンスが受信したJSONペイロードを更新できるようにするためのベストプラクティスがどれであるかわかりません。
サブクラス化しましょうか。
また、受信したオブジェクトをRKObjectLoaderリソースパスで指定された事前定義されたオブジェクトにマップするためのより良い方法があります(例:GET/conversations/2/msg。ここで結果のすべてのメッセージは定義されたMessengerConversationオブジェクト内にマップされます。 2)?
よろしく、
ピバ