ASIHttpRequest-requestの作成と実行
5270 ワード
同期要求
同期要求は現在のスレッドで実行されます。error属性を使って終了状態を確認します。
非同期要求
以下は最も簡単な非同期要求方法です。このrequestはグローバルなNSOperation Queで実行されます。もっと複雑な操作をするなら、自分でNSOperation QueまたはASINET workQueを作成する必要があります。
blockを使う
プラットフォームサポートの場合、ASIHT TPRequest 1.8以上はblockをサポートします。
キューを使う
NSOperation QueまたはASINetworkQueキューを作成し、最大同時接続数:maxCocurrentOperation Countを設定することもできます。
キュー内の各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をキャンセルしたいと思います。もう彼らの戻り状況に関心がないからです。このようにします
同期要求は現在のスレッドで実行されます。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のサブクラスで、より高級な特性を提供します。
すでに始まっている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];
}