web-dev-qa-db-ja.com

Swiftクロージャスレッドが終了するのを待つ

私は非常に単純なSwift SPMで作成されたプロジェクトを使用しており、Alamofireが含まれています。

main.Swift:

import Alamofire

Alamofire.request("https://google.com").responseString(queue: queue) { response in
            print("\(response.result.isSuccess)")
}

ロックを使用しないと、クロージャは実行されません。終了する前にすべてのスレッドまたはその特定のスレッドを待つように指示する方法はありますか?

これはPlaygroundsを使用して簡単に実現できることを私は知っています。

7

非同期タスクを待つ最も簡単な方法は、セマフォを使用することです。

let semaphore = DispatchSemaphore(value: 0)

doSomethingAsync {
    semaphore.signal()
}

semaphore.wait()

// your code will not get here until the async task completes

または、複数のタスクを待機している場合は、ディスパッチグループを使用できます。

let group = DispatchGroup()

group.enter()
doAsyncTask1 {
    group.leave()
}

group.enter()
doAsyncTask2 {
    group.leave()
}

group.wait()

// You won't get here until all your tasks are done
17
Charles Srstka

Swift 3

let group = DispatchGroup()
group.enter()
DispatchQueue.global(qos: .userInitiated).async {
    // Do work asyncly and call group.leave() after you are done
    group.leave()
}
group.notify(queue: .main, execute: {
    // This will be called when block ends             
})

このコードは、タスクの実行後にコードを実行する必要がある場合に役立ちます。

あなたの質問についての詳細を追加してください、そうすれば私はあなたをもっと助けることができます。

3
Nikhil Manapure