アプリケーションでブロックを使用したいのですが、ブロックについて何も知りません。コードでブロックを使用する方法と理由を誰か説明できますか?
3 に答える
ブロックはクロージャー (またはラムダ関数ですが、呼び方は自由です) です。それらの目的は、ブロックを使用することで、プログラマーはグローバルスコープで名前付き関数を作成したり、ターゲットアクションコールバックを提供したりする必要がなくなり、代わりに名前のないローカル「関数」を作成して、その囲みの変数にアクセスできるようにすることです。スコープを設定し、アクションを簡単に実行できます。
たとえば、ビューのアニメーションなどの非同期操作をブロックなしでディスパッチし、競合の通知を受け取りたい場合は、次のように記述する必要があります。
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:context:)];
.... set up animation ....
[UIView commitAnimations];
これは大量のコードであり、さらに有効なself
ポインタが存在することを意味します-常に利用できるとは限りません(MobileSubstrate-tweaksを開発しているときにそのようなことを経験しました)。したがって、これの代わりに、iOS 4.0 以降のブロックを使用できます。
[UIView animateWithDuration:1.0 animations:^{
// set up animation
} completion:^{
// this will be executed on completion
}];
または、たとえば、NSURLConnection を使用してオンライン リソースをロードする... B. b. (ブロックの前):
urlConnection.delegate = self;
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)rsp
{
// ...
}
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
// ...
}
// and so on, there are 4 or 5 delegate methods...
AB (Anno ブロック):
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rsp, NSData *d, NSError *e) {
// process request here
}];
はるかに簡単で、きれいで、短いです。
ブロックは第一級の関数です。これは、ブロックが通常の Objective-C オブジェクトであることを巧妙に表現したものです。それらはオブジェクトであるため、パラメーターとして渡したり、メソッドや関数から返したり、変数に割り当てたりすることができます。ブロックは、宣言時に状態をカプセル化するため、Python、Ruby、Lisp などの他の言語ではクロージャーと呼ばれます。ブロックは、そのスコープ内で参照されるローカル変数の const コピーを作成します。ブロックの前に、何らかのコードを呼び出して後で呼び出したい場合は、通常、デリゲートまたは NSNotificationCenter を使用していました。これは問題なく機能しましたが、コードが全体に広がってしまいます。ある場所でタスクを開始し、別の場所で結果を処理します。
たとえば、ブロックを使用したビュー アニメーションでは、次のすべてを行う必要がなくなります。
[UIView beginAnimations:@"myAnimation" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[myView setFrame:CGRectMake(30, 45, 43, 56)];
[UIView commitAnimations];
これを行うだけで済みます:
[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[myView setFrame:CGRectMake(54, 66, 88, 33)];
}completion:^(BOOL done){
//
}];