Slide 1

Slide 1 text

Meet async/await in Swift 集まれSwift好き!Swift愛好会スピンオフ WWDC21セッション要約会 @オンライン 2021/06/25 Hironobu Iga

Slide 2

Slide 2 text

自己紹介 ● Hironobu Iga ● Flutter, React, Ktor(Kotlin), iOS ● Twitter - @iganin_dev

Slide 3

Slide 3 text

同期処理と非同期処理

Slide 4

Slide 4 text

非同期処理 非同期処理を活用することでスレッドを有効に使える(通信、DB etc)

Slide 5

Slide 5 text

非同期処理 非同期処理を活用することでスレッドを有効に使える(通信、DB etc) 同期処理はスレッドを ブロックする

Slide 6

Slide 6 text

非同期処理 非同期処理を活用することでスレッドを有効に使える(通信、DB etc) 非同期処理によって処理の 待ち時間に他の処理を差し 込むことができる

Slide 7

Slide 7 text

非同期処理の例

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

サムネイル画像を取得する

Slide 10

Slide 10 text

同期処理

Slide 11

Slide 11 text

非同期処理

Slide 12

Slide 12 text

従来のCompletion Handler を使用した方法

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

ネストが深い

Slide 15

Slide 15 text

エラーハンドリングを completionで伝える必要がある 漏れていてもコンパイラが検知してくれない 同様に値の返却も忘れる可能性があり、こちらもコンパイ ラが検知してくれない

Slide 16

Slide 16 text

実行順が複雑で処理を追うのが難しい

Slide 17

Slide 17 text

async / await を使った方法

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

内部で中断する処理が入る場合は asyncをつける 例外を投げる場合は、 async throwsの順 でないとコンパイルエラー ※SE-0296に詳細

Slide 20

Slide 20 text

中断する処理には await をつける 例外を投げる可能性がある場合は try await ※ await try はコンパイルエラー

Slide 21

Slide 21 text

例外が発生しうる処理は try await と記載され、 例外処理の実装漏れの可能性がなくなった completionの書き漏れによる値の返却漏れもなく なった

Slide 22

Slide 22 text

実行順が上から下になり、 処理が格段に追いやすくなった

Slide 23

Slide 23 text

getter ( setter は不可 ) - SE-0310, for 文 init( deinit は不可 ), subscript ( arrray[i]のようなアクセス) async / await が使用できるケース

Slide 24

Slide 24 text

上記は await の関数を直列に順次実行していく 同時に並列に実行する方法は、 Structured concurrency in Swift セッション で確認可能

Slide 25

Slide 25 text

async / await になったメソッドをSwiftUIで使う

Slide 26

Slide 26 text

async / await になったメソッドをSwiftUIで使う

Slide 27

Slide 27 text

async / await になったメソッドをSwiftUIで使う 中断をする関数をawait付きで呼び出 すために async { } で囲う必要がある

Slide 28

Slide 28 text

● URLSession ● MapKit ● HealthKit ● NSDocument ● etc... asnyc / await はさまざまなSDKに導入済み

Slide 29

Slide 29 text

● URLSession ● MapKit ● HealthKit ● NSDocument ● etc... asnyc / await はさまざまなSDKに導入済み

Slide 30

Slide 30 text

Continuation

Slide 31

Slide 31 text

Continuation ● 中断している処理を保持し、処理の再開(resume)を明示的に行える ○ 実装を見ているとCompletion Handlerに似てる気がする ● 再開(resume)は一度しか呼べない ● withCheckedContinuation ○ 呼び出しが一度だけかどうか、呼び出し忘れていないかどうかを実行時にチェックしてくれる ○ 2度呼び出した場合はクラッシュ (CONTINUATION MISUSE) ● withUnsafeContinuation ○ 呼び出しが一度だけか、呼び出し忘れがないかのチェックがない ○ 2度呼び出した場合はクラッシュ (EXC_BAD_ACCESS) ○ SDKなどでのパフォーマンス効率化以外では極力使用しない

Slide 32

Slide 32 text

Continuationを使う例 以下の処理を考える ● PeerManagerの syncSharedPostメソッドを呼び出す ● 返却値かエラーをDelegateメソッドを介して受け取る 上記ををasync / await を使用した形に書き換える

Slide 33

Slide 33 text

メソッド呼び出しの結果を delegateメソッド経 由で受け取る

Slide 34

Slide 34 text

メソッド呼び出しに関する Continuationをクラ スのプロパティに保持する ( CompletionHandlerを保持するのと似てる )

Slide 35

Slide 35 text

Delegateメソッドに値が返ってきたタイミング で結果とともにcontinuationのrsumeを呼 ぶ continuationは1度しかresumeできないた め保持していたcontinuationは破棄する

Slide 36

Slide 36 text

まとめ ● async / await で非同期処理がシンプルにかける ● getter, for文 initializer, subscript etcで使える ● completionHandler の async / await への置き換え ● Delegationメソッドのasync / awaitへの置き換え ● 複数のSDKにすでに導入済み ● Continuationについて ● セッションにはなかったですが、 iOS15以上でないと使用できないようです