1. ホーム
  2. swift

[解決済み] タスクが終了するまで待機する

2022-08-03 04:18:55

質問

DispatchQueueのタスクが終了するまで、私のコードを待たせることはできますか?CompletionHandlerか何かが必要なのでしょうか?

func myFunction() {
    var a: Int?

    DispatchQueue.main.async {
        var b: Int = 3
        a = b
    }

    // wait until the task finishes, then print 

    print(a) // - this will contain nil, of course, because it
             // will execute before the code above

}

Xcode 8.2を使用し、Swift 3で記述しています。

どのように解決するのですか?

使用方法 DispatchGroup を使って実現します。通知を受けるには、グループの enter()leave() の呼び出しがバランスされます。

func myFunction() {
    var a: Int?

    let group = DispatchGroup()
    group.enter()

    DispatchQueue.main.async {
        a = 1
        group.leave()
    }

    // does not wait. But the code in notify() gets run 
    // after enter() and leave() calls are balanced

    group.notify(queue: .main) {
        print(a)
    }
}

または待つことができます。

func myFunction() {
    var a: Int?

    let group = DispatchGroup()
    group.enter()

    // avoid deadlocks by not using .main queue here
    DispatchQueue.global(attributes: .qosDefault).async {
        a = 1
        group.leave()
    }

    // wait ...
    group.wait()

    print(a) // you could also `return a` here
}

注意 : group.wait() は現在のキュー(あなたの場合、おそらくメインキュー)をブロックするので dispatch.async がブロックされるのを防ぐために、(上記のサンプルコードのように) 別のキューで デッドロック .