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には新しいTimerメソッドがあります。ブロック初期化子
(遅れたアクションはキャンセルされる可能性があります)
let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
// do stuff 42 seconds later
}
ただし、覚えておいてください。デフォルトでは、デフォルトの実行ループモードにタイマーが追加されます。これは、このループモードが保留になっているとき(たとえば、UIScrollViewをスクロールするとき)タイマーがフリーズすることを意味します)特定の実行ループモードへのタイマー:
RunLoop.current.add(timer, forMode: .commonModes)
この ブログ記事で あなたはより多くの詳細を見つけることができます。
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
}
1つの方法は、多くの人が答えているように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
}