2

Я хочу передать аргумент блока -performSelector:withObject:afterDelay:. Для примера рассмотрим следующее:Безопасно ли передать блок Objective-C для выполненияSelector: withObject: afterDelay :?

[self performSelector:@selector(delayedBlock:) withObject:^{ 
    // some code in block 
} afterDelay:2]; 

- (void)delayedBlock:(void (^)(void))code { 
    code(); 
} 

Это работает, но я не уверен, что мне нужно сделать что-то особенное из АРК.

+1

Почему бы не заменить все это вызовет 'dispatch_after'? Это чище, и вам не нужен дополнительный метод. – rmaddy

+0

Проверьте обсуждение здесь: http://stackoverflow.com/questions/4007023/blocks-instead-of-performselectorwithobjectafterdelay – Merlevede

ответ

0

Как пишет rmaddy в комментарии, есть лучшие способы выполнить блок с задержкой, но если вы хотите использовать performSelector:withObject:afterDelay:, вам следует скопировать блок.

[self performSelector:@selector(delayedBlock:) withObject:[^{ 
    // some code in block 
} copy] afterDelay:2]; 

От Blocks Programming Topics:

Как правило, вам не нужно копировать (или сохранить) блок. Вам нужно только сделать копию, когда вы ожидаете, что блок будет использоваться после уничтожения области, в которой он был объявлен. Копирование перемещает блок в кучу.

0

Вы можете использовать GCD непосредственно:

Вот простой метод, основанный на НОД, что я использую:

void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void)) 
{ 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*delay), 
     dispatch_get_current_queue(), block); 
} 

Или использовать эту полезную категорию:

@implementation NSObject (PerformBlockAfterDelay) 


- (void)performBlock:(void (^)(void))block 
      afterDelay:(NSTimeInterval)delay 
{ 
    block = [block copy]; 

    [self performSelector:@selector(fireBlockAfterDelay:) 
       withObject:block 
       afterDelay:delay]; 
} 

- (void)fireBlockAfterDelay:(void (^)(void))block 
{ 
    block(); 
} 

@end 

Проверьте это cussion в этой теме: Blocks instead of performSelector:withObject:afterDelay:

+0

Одним из недостатков является отправка_а после этого не отменяется. PerformSelector отменяется с помощью cancelPerformSelector. – JoJo