Concurrency (async/await, Task, Actor, ..)
async/await
-
Task
Task
はインスタンス化?されたらクロージャが即実行されるTask
のクロージャが戻り値を返す場合、.value
で受け取る。もちろんawait
つける
-
async
/await
async
→ 並行して実行されるメソッドの定義に書く。 computed property でも良いawait
→async
なメソッドを実行して待つ
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