26

アプリケーションでブロックを使用したいのですが、ブロックについて何も知りません。コードでブロックを使用する方法と理由を誰か説明できますか?

4

3 に答える 3

30

ブロックはクロージャー (またはラムダ関数ですが、呼び方は自由です) です。それらの目的は、ブロックを使用することで、プログラマーはグローバルスコープで名前付き関数を作成したり、ターゲットアクションコールバックを提供したりする必要がなくなり、代わりに名前のないローカル「関数」を作成して、その囲みの変数にアクセスできるようにすることです。スコープを設定し、アクションを簡単に実行できます。

たとえば、ビューのアニメーションなどの非同期操作をブロックなしでディスパッチし、競合の通知を受け取りたい場合は、次のように記述する必要があります。

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

はるかに簡単で、きれいで、短いです。

于 2012-08-29T11:36:26.567 に答える
14

Ray Wenderlich チュートリアルの引用

ブロックは第一級の関数です。これは、ブロックが通常の 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){
    //
}];
于 2012-08-29T11:36:27.753 に答える