반응형
지연 후 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
반응형
'programing' 카테고리의 다른 글
Android에서 기본 활동으로 데이터 다시 보내기 (0) | 2023.08.14 |
---|---|
줄 간격 설정 (0) | 2023.08.14 |
Javascript / jQuery를 통해 Android 전화기 탐지 (0) | 2023.08.14 |
TypeScript를 사용하는 Angular2의 http 데이터에서 RxJS 관찰 가능한 항목 연결 (0) | 2023.08.14 |
월 이름을 월 번호에 매핑하거나 그 반대의 경우는 어떻게 합니까? (0) | 2023.08.14 |