質問

さまざまなブロックをメソッドに渡したいと思います。そのメソッドは、その後、パラメーターとして渡されたブロックを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?

役に立ちましたか?

解決

いいえ、それはクールではありません - Dispatch_asyncに渡されたブロックは、パラメーターを取得せず、何も返さない必要があります。 ComputationBlockをそれにキャストするのは悪い考えでしょう(母なる自然をだますのはいいことではありません)。

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

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

(呼び出したときに、計算ブロックにパラメーターを提供する必要があることに注意してください。)

他のヒント

コンパイルされる可能性がありますが、機能しません。 dispatch_block_t ブロックには議論を受け取ってはなりません。また、返品値を持ってはなりません。

__blockを使用して値を渡します

__block int backvalue;

ブロックで変更できます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top