0

REST サーバーのクライアントとして機能する iOS アプリを作成しています。これまでのところ、すべてのリクエストを非常に簡単な方法で処理してきました。電話をかける必要があるときはいつでも、次のようにします。

[ApiRequestManager sendApiCall:@"dogs/getSomeDog"
                    withParams:@{ @"dog_name": @"freddo" }
                      callback:^(NSDictionary *result) {
                          // do something with the response data already unserialized
                          // (comes as JSON) by the ApiRequestManager static method.
                      }];

NSMutableURLRequestアプリが複雑になるにつれて、次のように、実際にサブクラス化して応答用の独自のプロトコルを作成すると、はるかにクリーンになる (そしてテストの労力が減る) ことに気付きます。

@protocol ApiRequestDelegate <NSObject>

- (void)apiRequest:(ApiRequest *)request didSucceedWithResult:(NSDictionary *)result;

@optional
- (void)apiRequest:(ApiRequest *)request didFailWithError:(NSError *)error;

@end

これにより、リクエストの作成とそのレスポンスの処理などのコードを分離できます。委任パターンを使用して古い呼び出しを置き換え始めたときは、すべてうまくいきましたが、! その後、あちこちで次のようなことをしていることに気付きました。

// in class Dog
+ (void)putLeashOnDogs:(NSArray *)dogs {
    NSString *ids = // collect IDs from dogs

    [ApiRequestManager sendApiCall:@"dogs/putLeash"
                        withParams:@{ @"dog_ids": ids }
                          callback:^(NSDictionary *result) {
                              // something
                          }];
}

私の質問は、「このクラスは X プロトコルメソッドの静的バージョンを持つことになる」と何とか言って、委任オブジェクト (ApiRequest インスタンス) を作成する静的メソッドで言うことができますmyRequest.delegate = selfか? これを解決できない場合、またはこれを解決するためのより良い/よりクリーンな/より正しい方法がある場合、どのようなオプションがありますか?

4

2 に答える 2

1

私は間違っているかもしれませんが、あなたが抱えている問題は、NSURLConnection で複数の同時ダウンロードを行う問題に似ているように思えます。つまり、そのような NSURLConnection ごとに、結果を受け取るために個別のデリゲートが必要です。もしそうなら、単純な解決策は、クラスレベルで統一するのではなく、逆に、分離する必要があるすべてのものを個別のオブジェクトとして具現化することだと思います。

connectionすべてのデリゲート メソッドと共にプロパティを持つクラス MyDownloader があります。それを使用するには、それをインスタンス化し、connectionプロパティを初期化し、開始するように指示します。各 MyDownload は独自の NSURLConnection を担当し、その接続のデリゲートです。これで、問題を効果的にレベルアップしました。複数の NSURLConnections の猫を群れにする代わりに、複数の MyDownloader インスタンスの猫を群れにします。それぞれのインスタンスは、少なくともダウンロードが完了するまで保持する必要があります。しかし、それは簡単な問題です。最小限の解決策は、たとえば、それらを NSMutableSet に格納することです。

わかりました、それ役に立ちましたか、それともあなたの質問とはまったく関係のないことについて 2 つの段落を話しただけでしたか?

于 2013-05-07T02:27:22.507 に答える