iphone - objective c 콜백




performSelector 대신 블록:withObject:afterDelay: (4)

나는 종종 몇 마이크로 초 후에 코드를 실행하기를 원한다. 바로 지금, 나는 이것을 다음과 같이 해결한다.

- (void)someMethod
{
    // some code
}

이:

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

작동하지만 매번 새로운 방법을 만들어야합니다. 이 대신 블록을 사용할 수 있습니까? 기본적으로 나는 다음과 같은 메소드를 찾고있다.

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

그게 내게 정말 도움이 될거야.


긴 지연이 특별히 필요한 경우 위의 솔루션은 정상적으로 작동합니다. 큰 성공을 거둔 @ nick의 접근 방식을 사용했습니다.

그러나 주 루프의 다음 반복 동안 블록을 실행하려면 다음을 사용하여 블록을 더 작게 줄일 수 있습니다.

[[NSOperationQueue mainQueue] addOperationWithBlock:aBlock];

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


내장 된 방법이 없지만 카테고리를 통해 추가하는 것은 그리 좋지 않습니다.

@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에 대한 크레디트.


또 다른 방법은 (아마도 여러 가지 이유로 이것을하는 최악의 방법입니다) :

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

비슷한 코드를 다음과 같이 사용했습니다.

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...  
    });




objective-c-blocks