1

いくつかのデータを含む一連のリクエストをサーバーに送信する必要があります。後続のリクエストのデータは、以前のリクエストでのサーバーの応答に基づいて決定されます。非常に制限があるため、クラスで同期アプローチを使用したくありませんNSURLConnection(たとえば、リクエストの1つについては、リダイレクトを防ぐ必要があります。Apple Devのドキュメントによると、これはデリゲート実装でのみ実行できます)。

チェーン内のどのリクエストであるかに応じて、さまざまなことを行う必要があります (さまざまなメッセージをさまざまなクラスに送信します)。

私が今見ている方法は、リクエストごとにn個のデリゲートを作成するかinitWithFlag、異なるフラグでそのデリゲートのインスタンスを作成するデリゲートを作成するか、ファクトリパターンのようなものを使用する必要があるということですこれは、2番目のソリューションと非常によく似たソリューションになります。

デリゲートをまったく実装したくありません。可能な限り最小限のコーディングでリクエストを送信したいと考えています。フレームワーク(ASIHTTPRequestなど)も見ていません。ネイティブクラスでやりたいです。

最善のアプローチは何ですか?

4

2 に答える 2

0

結局、デリゲートの実装に落ち着きました。私がつまずいた主な点は次のとおりです。

  1. デリゲート メソッドを .h ファイルで宣言しないでください。彼らはそのようには機能しません。それらを実装に追加するだけです。
  2. デリゲートはNSURLConnection initWithRequestメソッド内で初期化することも、親クラスのプロパティとして保持することもできますが、違いはありません。
  3. 複数のリクエストを処理する最良の方法は、推奨さinitWithFlagれる . したがって、接続の初期化時にデリゲートを作成することをお勧めします。デリゲートは、ARC の下で完全なデータ転送を実行するのに十分な長さです。
  4. リダイレクトをキャンセルする最も便利な方法は、Apple の Developer Library から入手できます。

      -(NSURLRequest *)connection:(NSURLConnection *)connection  
        willSendRequest:(NSURLRequest *)request  
       redirectResponse:(NSURLResponse *)redirectResponse  
    {  
    NSURLRequest *newRequest = request;  
    if (redirectResponse)   
    {  
        newRequest = nil;  
    }  
    return newRequest;  
    }
    

    このメッセージは、公開されていない理由により、接続中に数回送信されることに注意してください。ただし、応答が実際のリダイレクトでない場合 redirectResponsenil. リクエストを に設定するnilと、リダイレクトはキャンセルされますNSURLConnectionが、元のデータの処理は終了します (つまり、connectionDidFinishLoadingメッセージが送信されます)。この動作をキャンセルするには、次のメッセージを送信します。 [connection cancel];

  5. NSNotifications結果を親クラスに渡す最良の方法であることがわかりました。

于 2013-05-18T11:59:21.013 に答える