1

私は現在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)?

よろしく、
ピバ

4

1 に答える 1

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: @""];
于 2012-07-13T14:57:46.843 に答える