メソッドの通過ブロック
-
30-09-2019 - |
質問
さまざまなブロックをメソッドに渡したいと思います。そのメソッドは、その後、パラメーターとして渡されたブロックを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;
ブロックで変更できます
所属していません StackOverflow