Проходные блоки для методов - PullRequest
3 голосов
/ 07 января 2011

Я хотел бы передать в разных блоках в метод.Метод впоследствии будет использовать переданный блок в качестве параметра для 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 ]

12 голосов
/ 07 января 2011

Нет, это не круто, блок, переданный в dispatch_async, не должен принимать никаких параметров и ничего не возвращать. Приведение вашего ComputationBlock к этому было бы плохой идеей (это нехорошо, чтобы обмануть мать-природу).

Просто оберните свой блок, который вы хотите вызвать, внутри одного из правильных типов:

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

(обратите внимание, что вам также необходимо указать параметр для вашего ComputationBlock при его вызове.)

4 голосов
/ 07 января 2011

Может скомпилироваться, но не сработает.dispatch_block_t блоки не должны принимать никаких аргументов и не должны иметь возвращаемого значения.

0 голосов
/ 24 сентября 2011

Передать значение с помощью __block

__ block int backValue;

может изменяться в блоке

...