Skip to main content

Concurrency (async/await, Task, Actor, ..)

async/await

  • Task

    • Task はインスタンス化?されたらクロージャが即実行される
    • Task のクロージャが戻り値を返す場合、.value で受け取る。もちろん await つける
  • async/await

    • async → 並行して実行されるメソッドの定義に書く。 computed property でも良い
    • awaitasync なメソッドを実行して待つ
swift
Task(priority: .background) {
let x = await func1() // 呼んだときに待つ場合
print(x)

async let x = func1() // 参照するときに待つ場合
print(await x)
}
...
func func1() async -> String {
// ...
return x
}
  • Actor
    • メソッドがデフォルトで synchronized となったクラスのようなもの、ということ?
    • 呼ぶときは await つけて呼ぶ
    • synchronized でなくて良いものは nonisolated をつける
  • Sendable
    • スレッドセーフであることを明示するということ?
    • final class Class01: Sendable { ... のように指定
    • @unchecked
  • Main Actor
    • メインスレッドで走るコードのこと
    • 方法1: @MainActor で指定したメソッド
    • 方法2: MainActor.run { ... } で呼んだブロック

この辺は、こういうのがあるという程度でメモ。

  • AsyncIteratorProtocol, AsyncSequence
    • 順番に実行したいとき用?
    • makeAsyncIterator()
    • next()
  • Task Group
    • withTaskGroup(of: Type, returning: Type, body: Closure) { group in ...
    • group.addTask(priority: .background) { ...
  • Asynchronous Image
    • AsyncImage