1

ブロックは iOS に追加された最新の機能の 1 つであることは認識しています。しかし、私は本当に見つけています

それを学ぶのに苦労しました。

私は人々が次のことをしているのを見てきました

typedef void(^CallBackBlk) (NSString *);


@property(copy,nonatomic)CallBackBlk block;

そして.mクラスで

-(void)doSomething:(CallBackBlk )cb{

       self.block=cb;

}

ここで cb に割り当てることの用途がわかりませんでした。単純に次のことを行うことはできませんか

-(void)doSomthing{

   block(@"my string");

}

ブロックをインスタンス変数に格納する目的が本当にわかりません。助けてもらえますか

例を挙げて。どんな助けでも大歓迎です

4

5 に答える 5

4

あなたのdoSomething方法では、どこblockから来るのですか?

それに答えれば、理由がわかります。


ああ - 解説は質問を明確にします。スナークは目的を果たしました (スナークで怠惰すぎて、午前 7 時に iPhone で本当の答えを入力することができませんでした :)。

インスタンス変数は、物を入れるための単なるスロットです。そもそもそのスロットには何もありません。

あなたの場合、次を実装できます。

-(void)doSomething:(CallBackBlk )cb{
       cb();    
}

ただし、通常、何かを非同期で実行する場合は、コールバックが使用されます。たとえば、次のようにします。

[myObject doSomething:^{
     NSLog(@"did something");
 }];

その後:

-(void)doSomething:(CallBackBlk)cb {
    dispatch_async(... global concurrent queue ..., ^{
         ... do some work ...
         cb();
    });
 }

つまり、発生doSomething:するとすぐに戻りdispatch_async()ます。コールバック ブロックは、非同期操作が行われたことを知らせるコールバックに使用されます。

もちろん、インスタンス変数はまだ必要ありません。もう少し何かを行うクラスを取り上げます。ある種の比較的複雑な状態遷移エンジンにします。たとえば、平均的なインターネット ダウンローダーや計算負荷の高いシミュレーション エンジンなどです。その時点で、すべてのバックグラウンド作業を 1 つのメソッドにまとめると非常に複雑になるため、コールバック ブロックを押し込むことになります (複数ある可能性があります。プログレス アップデーター、完了ブロック、および/またはエラー ブロック)。 、たとえば) インスタンス変数にクラスの実装を機能のラインに沿ってより明確に細分化することができます。

于 2013-04-12T14:19:20.833 に答える
1

ブロックをインスタンス変数に格納する用途は何ですか

おそらく、後でアクセスできるようになりますか?

于 2013-04-12T14:19:37.850 に答える
1

ブロックを後で呼び出したい場合は、それを割り当てるメソッドが既に戻った後にそれを行います。

たとえば、ダウンロードを管理するオブジェクトを考えてみましょう。ダウンロードが完了したときに呼び出されるブロックが必要な場合がありますが (UI を更新するためなど)、ダウンロード メソッドが完了するまで待機する必要はありません (時間がかかるため)。

于 2013-04-12T14:21:12.720 に答える