programing

메서드 호출을 1초간 지연하려면 어떻게 해야 합니까?

subpage 2023. 4. 9. 21:31
반응형

메서드 호출을 1초간 지연하려면 어떻게 해야 합니까?

메서드 호출을 1초간 지연시키는 쉬운 방법이 있습니까?

나는 가지고 있다UIImageView터치 이벤트에 반응합니다.터치가 감지되면 앱에서 애니메이션이 발생합니다.1초 후에 다른 메서드를 호출합니다.이 경우, 저는 이 명령어를 사용할 수 없습니다.animationDidStop셀렉터

performSelector:withObject:afterDelay:

문서 레퍼런스

블록도 사용할 수 있습니다.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [object method]; 
});

대부분의 경우 dispatch_get_main_queue를 사용하지만 메서드에 UI가 없는 경우 글로벌 큐를 사용할 수 있습니다.

편집:

Swift 3 버전:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    object.method()
}

마찬가지로DispatchQueue.global().asyncAfter(...좋은 선택일 수도 있습니다.

가장 좋은 방법은 다음과 같습니다.

[self performSelector:@selector(YourFunctionName) 
           withObject:(can be Self or Object from other Classes) 
           afterDelay:(Time Of Delay)];

Object 파라미터와 마찬가지로 0을 전달할 수도 있습니다.

예:

[self performSelector:@selector(subscribe) withObject:self afterDelay:3.0 ];

이미 많은 답이 있고 모두 정답이다.를 사용하고 싶은 경우dispatch_after에 포함되어 있는 스니펫을 찾고 있을 것입니다.Code Snippet Library오른쪽 하단의 (여기에서는,UI요소).

여기에 이미지 설명 입력

따라서 디스패치를 코드로 작성하여 이 스니펫을 호출하기만 하면 됩니다.

여기에 이미지 설명 입력

0.1초 지연 방식이 호출된 후 perform selector를 사용하여 다음 코드를 호출할 수 있습니다.

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

다음 항목도 있습니다.

[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(); });
}

당신은 이걸 할 수 있다.

[self performSelector:@selector(MethodToExecute) withObject:nil afterDelay:1.0 ];

스위프트 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")
}

Swift 3.x --&-- Swift 4

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    print("do some work")
}

또는 a에 합격escaping closure

func delay(seconds: Double, completion: @escaping()-> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: completion)
}

선택한 솔루션에서 Swift 3 솔루션이 있습니다.

self.perform(#selector(self.targetMethod), with: self, afterDelay: 1.0)

그리고 방법이 있다.

@objc fileprivate func targetMethod(){

}

Swift 3에서 사용

perform(<Selector>, with: <object>, afterDelay: <Time in Seconds>)

메모: 하나의 방법뿐만 아니라 전체 스레드가 일시 중지됩니다.
메서드를 호출하기 직전에 sleeve/wait/halt로 1000밀리초 동안 호출하시겠습니까?

Sleep(1000); // does nothing the next 1000 mSek

Methodcall(params); // now do the real thing

편집: 위의 답변은 응답 시 질문이었던 "메서드 호출을 1초간 지연시키는 방법"에 해당됩니다(원래 질문에서 7분 이내에 답변이 제공됨).그 당시 언어에 대한 정보가 없었기 때문에 수업 부족에 대해 올바른 수면 방법에 대해 불평하지 말아주세요.

언급URL : https://stackoverflow.com/questions/920675/how-can-i-delay-a-method-call-for-1-second

반응형