programing

지연 후 Selector:withObject:를 수행하는 대신 블록:

closeapi 2023. 8. 14. 22:52
반응형

지연 후 Selector:withObject:를 수행하는 대신 블록:

앞으로 몇 마이크로초 안에 코드를 실행하고 싶을 때가 많습니다.지금 저는 이렇게 해결하고 있습니다.

- (void)someMethod
{
    // some code
}

그리고 이것은:

[self performSelector:@selector(someMethod) withObject:nil afterDelay:0.1];

효과는 있지만 매번 새로운 방법을 만들어야 합니다.이것 대신 블록을 사용하는 것이 가능합니까?기본적으로 저는 다음과 같은 방법을 찾고 있습니다.

[self performBlock:^{
    // some code
} afterDelay:0.1];

그것은 저에게 정말 유용할 것입니다.

이를 위한 기본 제공 방법은 없지만 범주를 통해 추가하는 것도 나쁘지 않습니다.

@implementation NSObject (PerformBlockAfterDelay)

- (void)performBlock:(void (^)(void))block 
          afterDelay:(NSTimeInterval)delay 
{
    block = [[block copy] autorelease];
    [self performSelector:@selector(fireBlockAfterDelay:) 
               withObject:block 
               afterDelay:delay];
}

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

@end

기본 구현에 대한 공로를 Mike Ash에게 돌립니다.

제가 사용하는 GCD 기반의 간단한 기술은 다음과 같습니다.

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

저는 GCD 전문가가 아니며, 이 솔루션에 대한 의견에 관심이 있습니다.

다른 방법(아마도 여러 가지 이유로 인해 최악의 방법일 것입니다)은 다음과 같습니다.

[UIView animateWithDuration:0.0 delay:5.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
} completion:^(BOOL finished) {
    //do stuff here
}];

특별히 더 긴 지연이 필요한 경우 위의 해결책이 잘 작동합니다.저는 @nick의 접근법을 성공적으로 사용했습니다.

그러나 주 루프의 다음 반복 동안 블록을 실행하려면 다음과 같이 블록을 더욱 축소할 수 있습니다.

[[NSOperationQueue mainQueue] addOperationWithBlock:aBlock];

이는 performSelector: afterDelay 0.0f를 사용하는 것과 유사합니다.

나는 다음과 같은 유사한 코드를 사용했습니다.

double delayInSeconds = 0.2f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      //whatever you wanted to do here...  
    });

이 상황을 처리하는 완벽한 카테고리가 여기에 있습니다.

https://gist.github.com/955123

언급URL : https://stackoverflow.com/questions/4007023/blocks-instead-of-performselectorwithobjectafterdelay

반응형