BAD_ACCESS

おもにiOS、ときどき変な電子工作、ガジェット話。

ASIHTTPRequestで非同期処理をBlock使って実行。

この記事を参考に。ASIHTTPRequest example code - All-Seeing Interactive
Blockをあまり理解していない中で
これまでの処理との違い。

Block使わない

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.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使う

- (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];
}

実にシンプルに。置き換えられた部分を比較するとそれぞれの役割がなんとなく理解できた。
デリゲートを使う代わりにBlockで置き換えられたところは…
[request setCompletionBlock:^{...}]; これは事前の処理 [request startAsynchronous];が終わった後に呼び出されるブロック。
[request setFailedBlock:^{...}];はエラーのときに呼ばれるブロックだね。
こうやって見るとわかってきたかも。