[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_t
UInt64
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
}