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

이전 버전의 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에서 일련의 코드를 실행하기 전에 어떻게 지연을 만들 수 있습니까?



답변

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

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에서 원하는 “대기”효과를 만듭니다.

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


답변

나는 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)

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


답변

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

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

용법

delayWithSeconds(1) {
   //Do something
}


답변

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

//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
}


답변

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

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

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

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


답변

// 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
}


답변