ASIHttpRequest-requestの作成と実行

5270 ワード

同期要求
同期要求は現在のスレッドで実行されます。error属性を使って終了状態を確認します。
- (IBAction)grabURL:(id)sender
{
  NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  [request startSynchronous];
  NSError *error = [request error];
  if (!error) {
    NSString *response = [request responseString];
  }
}
同期要求は、主スレッドの実行をブロックし、ユーザインターフェースがユーザ操作に応答しないようになり、どの動画もレンダリングを停止します。
 
非同期要求
以下は最も簡単な非同期要求方法です。このrequestはグローバルなNSOperation Queで実行されます。もっと複雑な操作をするなら、自分でNSOperation QueまたはASINET workQueを作成する必要があります。
- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}
 
blockを使う
プラットフォームサポートの場合、ASIHT TPRequest 1.8以上はblockをサポートします。
- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}
注意してください。requestを宣言する時は_u uを使います。block修饰子、これはblockにretain requestがいらないことを教えるためで、retain循环が现れないようにします。requestはretain blockができるのです。
 
キューを使う
NSOperation QueまたはASINetworkQueキューを作成し、最大同時接続数:maxCocurrentOperation Countを設定することもできます。 
- (IBAction)grabURLInTheBackground:(id)sender
{
   if (![self queue]) {
      [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
      [self queue].maxConcurrentOperationCount = 4;
   }

   NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:@selector(requestDone:)];
   [request setDidFailSelector:@selector(requestWentWrong:)];
   [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}
selectorが設定されていない場合、システムはデフォルトのrequest Finishedを使用します。 和 request Failed:方法
キュー内の各requestを区別する必要がある場合、requestのuserInfo属性を設定することができ、NSDictionaryまたはより簡単な方法は、それぞれのrequestの属性を設定することであり、これらの2つの属性はサーバに送信されない。
requestのURLを使って各requestを区別しないでください。URLは変更されるかもしれないので、requestのURLを使うなら、「request origginal URL」を使って、これは永遠に最初のurlに戻ります。
ASINET work Queについて
ASINetworkQueはNSOperation Queのサブクラスで、より高級な特性を提供します。
  • request DidStartSelectorは、requestが実行を開始すると、このプロキシ関数を呼び出します。
  • request DidReceive ResonseHeaders Selectorは、キューの中のrequestがサーバから返されたヘッダ情報を受信すると、このプロキシ関数を呼び出します。大きいファイルをダウンロードするには、これは通常全体のrequestの完成より早いです。
  • request DidFinish Selectorは、各requestが完了すると、このプロキシ関数を呼び出します。
  • request DidFail Selectorは、各requestが失敗したとき、このプロキシ関数を呼び出します。
  • queue DidFinish Selectorは、キューが完了したとき(requestが失敗しても成功しても)、このプロキシ関数を呼び出します。
  • ASINetworkQueuesとNSOperationQuesは少し違っていますが、列に入ったrequestはすぐに実行されません。キューが進捗スイッチをオンにすると、キューが開始される時に、すべてのGET型requestに対してHEAD要求を行い、ダウンロードサイズを合計してから、本当にrequestが実行されます。
    すでに始まっているASINetworkQueへ requestに入るとどうなりますか?
    いくつかのrequestの進捗を追跡するためにASINetworkQueを使用すれば、新しいrequestが実行を開始する時にのみ、全体の進捗は適応調整(後へ移動)されます。ASINetworkQueは列が始まってから加入したrequestにHEAD要求をしないので、実行中の列にたくさんのrequestを加えると、総進捗はすぐに更新されません。
    すでにキューが開始されている場合は、再度「queue go」を呼び出す必要はありません。
    ASINetworkQueの中の一つのrequestが失敗した時、デフォルトではASINET work Queは他のすべてのrequestをキャンセルします。この特性を無効にするには、設定を無効にします。 [queue set Shoul dCancel AllRequests OnFailure:NO]。
    ASINetworkQueuesはASIHT TPrequest操作だけを実行できます。二つは汎用操作に使用できません。ASIHT TPRequestではないNSOperationに参加しようとすると、エラーが発生します。
     
    非同期要求をキャンセル
    非同期要求をキャンセルします。(requestが「request startAynchronous」から始まりますか?それともあなたが作成したキューから始まりますか?)「request cancel」を使ってください。同期要求はキャンセルされてはいけません。
    requestをキャンセルしたら、このrequestは要求に失敗したと見なされ、requestのプロキシまたはキューのプロキシの失敗プロキシ関数が呼び出されます。プロキシ関数を呼び出したくないなら、delegateをnilに設定したり、clear Delegates Andcall方法を使ってrequestをキャンセルしたりします。
    clear Delegates AndCall まず、すべてのプロキシとブロックをクリアします。
    ASINetworkQueueを使用すると、列の中の一つのrequestがキャンセルされると、他のすべてのrequestがキャンセルされます。ショートカットAllRequest OnFailureの値はNOとして設定できます。
     
    安全にdelegateを制御してrequestが完成する前に代理は釈放されます。
    requestは彼らの代理店ではないので、代理店を解放したかもしれません。その後、requestが完成したら、崩壊を引き起こすかもしれません。ほとんどの場合、あなたのエージェントがまもなくリリースされるなら、あなたもすべてのrequestをキャンセルしたいと思います。もう彼らの戻り状況に関心がないからです。このようにします
    //     dealloc  
    - (void)dealloc
    {
       [request clearDelegatesAndCancel];
       [request release];
       ...
       [super dealloc];
    }