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 投射到那将是一个坏主意(愚弄大自然是不好的)。

只需将要调用的块包装在正确的类型之一中:

 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 回答