传递方法块

时间:2011-01-07 00:58:51

标签: iphone objective-c grand-central-dispatch

我想将不同的块传递给方法。该方法随后将传入的块用作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吗?

3 个答案:

答案 0 :(得分:12)

不,这样做并不酷 - 传递给dispatch_async的块需要不带任何参数并且不返回任何内容。将你的ComputationBlock转换为一个坏主意(愚弄大自然并不好)。

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

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

(请注意,当您调用ComputationBlock时,还需要为其提供参数。)

答案 1 :(得分:4)

它可以编译,但它不起作用。 dispatch_block_t块不能带任何参数,也不能有返回值。

答案 2 :(得分:0)

使用__block传递值

  

__ block int backValue;

它可以在块中修改