3

さまざまなブロックをメソッドに渡したいのですが。その後、メソッドは渡されたブロックをdispatch_asyncのパラメーターとして使用します。

私のブロックは次のように宣言されています:

typedef int (^ComputationBlock)(int);

ブロックを受け入れるクラスメソッドは、次のように実装されます。

- (void)doSomething:(int)limit withBlock:(ComputationBlock)block;
{

 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

   // typical in-lined block for dispatch_async:  
 dispatch_async(queue, ^{
      // do some work here
 });

 // I want to pass in the block as the 2nd parameter to dispatch_async
 // but the compiler will warn me of a type mismatch unless I cast
 // the block like:
 dispatch_async(queue, (dispatch_block_t)block);    
}

@end

block' 'パラメーターを次のように型キャストしても大丈夫dispatch_block_tですか?

4

3 に答える 3

12

いいえ、それはクールではありません。dispatch_asyncに渡されるブロックは、パラメーターを受け取らず、何も返さない必要があります。ComputationBlockをそれにキャストするのは悪い考えです(母なる自然をだますのは良くありません)。

呼び出したいブロックを適切なタイプの1つにラップするだけです。

 dispatch_async(queue, ^{ block(0); } );    

(ComputationBlockを呼び出すときに、パラメーターも指定する必要があることに注意してください。)

于 2011-01-07T01:10:37.760 に答える
4

コンパイルされるかもしれませんが、動作しません。 dispatch_block_tブロックは引数を取ってはならず、戻り値を持ってはなりません。

于 2011-01-07T01:07:59.877 に答える
0

__blockを使用して値を渡す

__block int backValue;

ブロックで変更できます

于 2011-09-24T02:16:14.980 に答える