2

차단 인수를 -performSelector:withObject:afterDelay:에 전달하고 싶습니다. 예를 들어, 다음 사항을 고려하십시오performSelector : withObject : afterDelay :?에 performive-C 블록을 전달하는 것이 안전합니까?

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

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

그것은 작동하지만 때문에 ARC의 특별한 무언가를 할 필요가 있는지 확실하지 않다.

+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에서 : 일반적으로

, 당신은 블록을 복사 (또는 유지) 할 필요가 없습니다. 블록이 선언 된 범위가 파기 된 후에 블록이 사용되기를 기대할 때만 복사본을 만들어야합니다. 복사하면 블록이 힙으로 이동합니다. 이 유용한 카테고리

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

또는 사용 : 여기

내가 사용하고 있음을, GCD에 따라 간단한 기술이다 :

0

당신은 GCD 직접 사용할 수 있습니다

@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 

이 스레드의 우발 : Blocks instead of performSelector:withObject:afterDelay:

+0

하나의 단점은 dispatch_after는 취소 할 수 없다는 것입니다. PerformSelector는 cancelPerformSelector를 사용하여 취소 할 수 있습니다. – JoJo