Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20210625-meet-async-await@swift愛好会

iganin
June 25, 2021

 20210625-meet-async-await@swift愛好会

iganin

June 25, 2021
Tweet

More Decks by iganin

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. 同期処理と非同期処理

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 非同期処理の例

    View Slide

  8. View Slide

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

    View Slide

  10. 同期処理

    View Slide

  11. 非同期処理

    View Slide

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

    View Slide

  13. View Slide

  14. ネストが深い

    View Slide

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

    View Slide

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

    View Slide

  17. async / await を使った方法

    View Slide

  18. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. Continuation

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. Delegateメソッドに値が返ってきたタイミング
    で結果とともにcontinuationのrsumeを呼

    continuationは1度しかresumeできないた
    め保持していたcontinuationは破棄する

    View Slide

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

    View Slide