web-dev-qa-db-ja.com

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で一連のコードを実行する前に、どのようにして遅延を作り出すことができますか?

268
owlswipe

多くの調査の結果、私はついにこれを考え出しました。

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で望ましい「待機」効果が得られます。

この答え の一部に触発されています。

799
owlswipe

私は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)

この ブログ記事で あなたはより多くの詳細を見つけることができます。

128
Victor Do

Swift 3.0以降に実装されている以下の関数を試してください

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

使用法

delayWithSeconds(1) {
   //Do something
}
51
Vakas

以下のコードを試してみてください

//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
}
29
Anand Verma

1つの方法は、多くの人が答えているようにDispatchQueue.main.asyncAfterを使用することです。

別の方法は、perform(_:with:afterDelay:)を使用することです。 詳細はこちら

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

@IBAction func delayedFunc() {
    // implement code
}
1
Zohaib Brohi

// 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
}
1
Pratyush Pratik