2011-01-07 68 views
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

回答

12

不,這不是很酷 - 傳遞給dispatch_async的塊需要不帶任何參數並且不返回任何內容。將您的ComputationBlock投射到這將是一個糟糕的想法(愚蠢的大自然不好)。

簡單包裝要裏面的正確類型的一個打電話給你塊:

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

(請注意,您還需要當你調用它的參數提供給你ComputationBlock。)

+0

N.B. 「ComputationBlock」在返回類型中也不匹配dispatch_block_t:應該是void,實際上是int!旁白:「愚蠢的大自然不好」\ *微笑\ * – danyowdee 2011-01-07 10:13:49

4

它可以編譯,但它不會工作。 dispatch_block_t塊不能帶任何參數,也不能有返回值。

0

傳遞值使用__block

__block int backValue;

它可以在塊修改