1 초 동안 메소드 호출을 지연시키는 쉬운 방법이 있습니까?
나는이 UIImageView
터치 이벤트에 그 반응하여합니다. 터치가 감지되면 앱에서 일부 애니메이션이 발생합니다. 1 초 후에 다른 방법을 호출하고 싶습니다. 이 경우 animationDidStop
셀렉터를 사용할 수 없습니다 .
1 초 동안 메소드 호출을 지연시키는 쉬운 방법이 있습니까?
나는이 UIImageView
터치 이벤트에 그 반응하여합니다. 터치가 감지되면 앱에서 일부 애니메이션이 발생합니다. 1 초 후에 다른 방법을 호출하고 싶습니다. 이 경우 animationDidStop
셀렉터를 사용할 수 없습니다 .
답변:
performSelector:withObject:afterDelay:
당신은 또한 블록을 사용할 수 있습니다
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[object method];
});
메소드에 UI가 없으면 전역 큐를 사용할 수 있지만 대부분의 경우 dispatch_get_main_queue를 사용하려고합니다 .
편집하다:
스위프트 3 버전 :
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
object.method()
}
마찬가지로 DispatchQueue.global().asyncAfter(...
좋은 옵션 일 수도 있습니다.
dispatch_after
하고 엔터를 누르십시오
dispatch_after
는을 입력 할 때 이것을 자동 완성합니다. 이것은 실제로 매우 간단한 방법이며 호출하는 메소드에 속성을 전달할 수 있습니다.
가장 좋은 방법은 다음과 같습니다.
[self performSelector:@selector(YourFunctionName)
withObject:(can be Self or Object from other Classes)
afterDelay:(Time Of Delay)];
withObject 매개 변수로 nil을 전달할 수도 있습니다.
예 :
[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];
당신은 또한 수:
[UIView animateWithDuration:1.0
animations:^{ self.view.alpha = 1.1; /* Some fake chages */ }
completion:^(BOOL finished)
{
NSLog(@"A second lapsed.");
}];
이 경우 애니메이션 작업을하려면보기를 약간 변경해야합니다. 실제로 해 키지 만 블록 기반의 물건을 좋아합니다. 또는 아래 @mcfedr 답변을 마무리하십시오.
waitFor(1.0, ^
{
NSLog(@"A second lapsed");
});
typedef void (^WaitCompletionBlock)();
void waitFor(NSTimeInterval duration, WaitCompletionBlock completion)
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC),
dispatch_get_main_queue(), ^
{ completion(); });
}
스위프트 2.x
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
print("do some work")
}
스위프트 3.x-&-스위프트 4
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
print("do some work")
}
또는 통과 escaping closure
func delay(seconds: Double, completion: @escaping()-> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: completion)
}
스위프트 3에서 사용
perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)
참고 : 이렇게하면 한 가지 방법이 아닌 전체 스레드가 일시 중지됩니다.
메소드를 호출하기 직전에 1000ms 동안 휴면 / 대기 / 중지 호출을 하시겠습니까?
Sleep(1000); // does nothing the next 1000 mSek
Methodcall(params); // now do the real thing
편집 : 위의 답변은 일반적인 질문 "어떻게 1 초 동안 메소드 호출을 지연시킬 수 있습니까?"에 적용됩니다. )). 그 당시에는 언어에 대한 정보가 없었으므로 수면을 사용하는 적절한 방법에 대해 친절하게 말하지 마십시오.