3

サーバーと非同期で通信するために ASIHTTPRequest を使用しています。それはうまく機能しますが、私は別のコントローラーでリクエストを行っており、重複したメソッドがすべてのコントローラーにあります。そのコード (リクエスト) を 1 つのクラスに抽象化して、コードを簡単に再利用できるようにする最善の方法は何ですか。これにより、コントローラーをよりシンプルに保つことができます。シングルトン (またはアプリ デリゲート) に入れることはできますが、それは良い方法ではないと思います。または、デリゲート コールバックを使用して独自のプロトコルを作成することもできます。

優れた設計アプローチに関するアドバイスは役に立ちます。ありがとう。

4

3 に答える 3

7

私はBenCopseyのサブクラスをASIHTTPRequestWebサービスクライアントに非常に頻繁に使用しており、今後数週間で終了したいと考えています。それは素晴らしいプロジェクトであり、彼の仕事は私に多くの時間と労力を節約してくれました。

アプリケーションデリゲートにASINetworkQueueセットアップがあります。キューには-goメッセージが送信され、リクエストを受信できるようになります。サブクラス化されたリクエストをこのキューに追加します。各リクエストは処理されて通知を発行し、ViewControllerはそれに応じて応答データを処理します。

私がやったことはサブクラスASIHTTPRequestと:

  1. -initメソッド(または-initWithParams:要求に応じてメソッド)を設定します
  2. Webサービスから返されるHTTPエラーメッセージをオーバーライド-requestFailed:して処理する-requestCompleted:
  3. 私のViewControllerは、メソッドNSNotificationのエラー処理からの通知を監視するために登録します-requestCompleted:

ビューコントローラがナビゲーションスタックにプッシュされたりポップされたりするので、さまざまな登録を追加および削除します。一部のViewControllerは、特定のサブクラス化された要求タイプのみをリッスンする必要があります。

リッスンすると、ダイアログNSNotificationを発行して、問題がUIAlertView発生したことをユーザーに通知したり、リクエストでHTTPエラーが成功したときにリクエストの応答データ(たとえば、結果をCore Dataストアにフィードしたり)を処理したりできます。

リクエストが成功したか失敗したかにかかわらず、リクエストが-release完了したときのことを覚えています。

于 2009-11-17T12:50:52.983 に答える
0

クラスメソッドとインスタンスメソッドの関係がわからない? クラス メソッドは TCHttpRequest をインスタンス化し、単一のインスタンスのみを保証します。loginWithUserName インスタンス メソッドは、ASIFormDataRequest をインスタンス化し、それを共通キューに追加します。ここで再利用は見られませんか?

于 2012-03-02T18:08:47.790 に答える
0

これを処理するシングルトン クラスを作成しました。

static  TCHttpRequest *_sharedHttpRequest = nil;
+ (id)sharedRequest
{
    @synchronized(self){
        if (_sharedHttpRequest == nil) {
            _sharedHttpRequest = [[self alloc] init];
        }
    }
    return  _sharedHttpRequest;
}


- (NSDictionary *)loginWithUserName:(NSString *)user password:(NSString *)pwd
{
    NSURL *url = [NSURL URLWithString:@"/login" relativeToURL:_url];

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setCachePolicy:ASICacheForSessionDurationCacheStoragePolicy];
    [request setTimeOutSeconds:HTTP_REQ_TIMEOUT];
    [request addPostValue:user forKey:@"username"];
    [request addPostValue:pwd forKey:@"password"];
    request.delegate = self.delegate;
    [_common_queue addOperation:request];
}
于 2011-07-14T02:59:19.207 に答える