Swift 3에서 지연을 프로그래밍하는 방법


330

이전 버전의 Swift에서는 다음 코드로 지연이 발생할 수 있습니다.

let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
    //put your code which should be executed with a delay here
}

그러나 이제 Swift 3에서 Xcode는 6 가지를 자동으로 변경하지만 다음과 같은 오류가 나타납니다. " 일명 DispatchTime.now예상 값으로 변환 할 수 없습니다 ."dispatch_time_tUInt64

Swift 3에서 일련의 코드를 실행하기 전에 어떻게 지연을 만들 수 있습니까?

답변:


966

많은 연구 끝에 마침내 이것을 알아 냈습니다.

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Change `2.0` to the desired number of seconds.
   // Code you want to be delayed
}

Swift 3 및 Swift 4에서 원하는 "대기"효과를 만듭니다.

이 답변 의 일부에서 영감을 얻었습니다 .


7
유용한 기여, 감사합니다! 최신 Swift 3 업데이트 :DispatchQueue.main.asyncAfter(deadline: when)
Rogare

77
"+ 2"를 "+ .seconds (2)"로 바꾸면 코드를 좀 더 빠르게 만들 수 있습니다. 또는 신속성을 극대화하기 위해 첫 번째 줄을 삭제하고 "deadline : when"을 "deadline : .now () + .seconds (2)"로 바꿀 수 있습니다.
RenniePet

2
@ OctavioAntonioCedeño 도와 드리겠습니다. 이것은 정말로 나를 잠시 버그로
만들었다

5
여전히 2017 년 3 월 12 일 일하고 있습니다. 대단히 감사합니다 :)
John Leonardo

3
문자 그대로 나의 가장 많이 방문한 게시물. 이 글을 실제로 기억하거나 내 코드에서 다른 곳을 찾는 것
보다이

154

나는 GCD에 대한 한 줄 표기법을 좋아합니다. 더 우아합니다.

    DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
        // do stuff 42 seconds later
    }

또한 iOS 10에는 블록 초기화 프로그램과 같은 새로운 타이머 메소드가 있습니다.

(지연된 조치가 취소 될 수 있음)

    let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
        // do stuff 42 seconds later
    }

Btw, 염두에 두십시오 : 기본적으로 타이머는 기본 실행 루프 모드에 추가됩니다. 사용자가 앱의 UI와 상호 작용할 때 타이머가 정지 될 수 있음을 의미합니다 (예 : UIScrollView를 스크롤 할 때). 특정 실행 루프 모드에 타이머를 추가하여이 문제를 해결할 수 있습니다.

RunLoop.current.add(timer, forMode: .common)

블로그 게시물에서 자세한 내용을 확인할 수 있습니다.


4
잘 잡아! 나는 이것을 아직 보지 못했다.
julien_c

8
메인 런 루프에 대한 타이머 비교 및 ​​면책 조항에 대한 하나 더하기!
Martin

2
좋은 캐치! 이것은 공학입니다.
Onur Şahindur

56

Swift 3.0 이상 에서 구현 된 다음 기능을 사용해보십시오

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

용법

delayWithSeconds(1) {
   //Do something
}

5
기본적 으로이 답변을 복사 했지만 예, 좋습니다. 감사합니다.
owlswipe

2
이것을 취소하는 방법?
Sourav Chandra

24

지연을 위해 아래 코드를 시도하십시오

//MARK: First Way

func delayForWork() {
    delay(3.0) {
        print("delay for 3.0 second")
    }
}

delayForWork()

// MARK: Second Way

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    // your code here delayed by 0.5 seconds
}

1
첫 번째 방법 디스플레이에 "확인되지 않은 식별자 '지연'사용"오류가 있음
Jerry Chong

5
이 프로그래머는 자신의 코드 기반에서 헬퍼 메소드를 사용하고 있으며 오랫동안 가지고 있습니다. 그래서 지연은 그가 SDK와 별다른 차이를 알지 못하는 동안 그가 사용한 코드였습니다.
Nick Perkins

4

한 가지 방법은 DispatchQueue.main.asyncAfter많은 사람들이 대답 한대로 사용 하는 것입니다.

다른 방법은을 사용하는 것 perform(_:with:afterDelay:)입니다. 자세한 내용은 여기

perform(#selector(delayedFunc), with: nil, afterDelay: 3)

@IBAction func delayedFunc() {
    // implement code
}

1

// x 초 후에 기능을 실행합니다

public static func runThisAfterDelay(seconds: Double, after: @escaping () -> Void) {
    runThisAfterDelay(seconds: seconds, queue: DispatchQueue.main, after: after)
}

public static func runThisAfterDelay(seconds: Double, queue: DispatchQueue, after: @escaping () -> Void) {
    let time = DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
    queue.asyncAfter(deadline: time, execute: after)
}

//사용하다:-

runThisAfterDelay(seconds: x){
  //write your code here
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.