Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20210625-meet-async-await@swift愛好会
Search
iganin
June 25, 2021
Technology
1
1.6k
20210625-meet-async-await@swift愛好会
iganin
June 25, 2021
Tweet
Share
More Decks by iganin
See All by iganin
Data Race and Actor
hironobuiga
0
52
Swift 5.1の変更点
hironobuiga
0
710
Other Decks in Technology
See All in Technology
Amazon ECS & AWS Fargate 運用アーキテクチャ2025 / Amazon ECS and AWS Fargate Ops Architecture 2025
iselegant
17
5.7k
生成AI活用の組織格差を解消する 〜ビジネス職のCursor導入が開発効率に与えた好循環〜 / Closing the Organizational Gap in AI Adoption
upamune
5
3.7k
Amazon S3標準/ S3 Tables/S3 Express One Zoneを使ったログ分析
shigeruoda
4
540
25分で解説する「最小権限の原則」を実現するための AWS「ポリシー」大全 / 20250625-aws-summit-aws-policy
opelab
9
1.2k
「Chatwork」の認証基盤の移行とログ活用によるプロダクト改善
kubell_hr
1
190
「良さそう」と「とても良い」の間には 「良さそうだがホンマか」がたくさんある / 2025.07.01 LLM品質Night
smiyawaki0820
1
220
BrainPadプログラミングコンテスト記念LT会2025_社内イベント&問題解説
brainpadpr
1
170
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 完全版 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming - Expanded
tomzoh
4
3.3k
Wasm元年
askua
0
150
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
5
520
Кто отправит outbox? Валентин Удальцов, автор канала Пых
lamodatech
0
350
5min GuardDuty Extended Threat Detection EKS
takakuni
0
150
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
Raft: Consensus for Rubyists
vanstee
140
7k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
GraphQLとの向き合い方2022年版
quramy
48
14k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Transcript
Meet async/await in Swift 集まれSwift好き!Swift愛好会スピンオフ WWDC21セッション要約会 @オンライン 2021/06/25 Hironobu Iga
自己紹介 • Hironobu Iga • Flutter, React, Ktor(Kotlin), iOS •
Twitter - @iganin_dev
同期処理と非同期処理
非同期処理 非同期処理を活用することでスレッドを有効に使える(通信、DB etc)
非同期処理 非同期処理を活用することでスレッドを有効に使える(通信、DB etc) 同期処理はスレッドを ブロックする
非同期処理 非同期処理を活用することでスレッドを有効に使える(通信、DB etc) 非同期処理によって処理の 待ち時間に他の処理を差し 込むことができる
非同期処理の例
None
サムネイル画像を取得する
同期処理
非同期処理
従来のCompletion Handler を使用した方法
None
ネストが深い
エラーハンドリングを completionで伝える必要がある 漏れていてもコンパイラが検知してくれない 同様に値の返却も忘れる可能性があり、こちらもコンパイ ラが検知してくれない
実行順が複雑で処理を追うのが難しい
async / await を使った方法
None
内部で中断する処理が入る場合は asyncをつける 例外を投げる場合は、 async throwsの順 でないとコンパイルエラー ※SE-0296に詳細
中断する処理には await をつける 例外を投げる可能性がある場合は try await ※ await try はコンパイルエラー
例外が発生しうる処理は try await と記載され、 例外処理の実装漏れの可能性がなくなった completionの書き漏れによる値の返却漏れもなく なった
実行順が上から下になり、 処理が格段に追いやすくなった
getter ( setter は不可 ) - SE-0310, for 文 init(
deinit は不可 ), subscript ( arrray[i]のようなアクセス) async / await が使用できるケース
上記は await の関数を直列に順次実行していく 同時に並列に実行する方法は、 Structured concurrency in Swift セッション で確認可能
async / await になったメソッドをSwiftUIで使う
async / await になったメソッドをSwiftUIで使う
async / await になったメソッドをSwiftUIで使う 中断をする関数をawait付きで呼び出 すために async { } で囲う必要がある
• URLSession • MapKit • HealthKit • NSDocument • etc...
asnyc / await はさまざまなSDKに導入済み
• URLSession • MapKit • HealthKit • NSDocument • etc...
asnyc / await はさまざまなSDKに導入済み
Continuation
Continuation • 中断している処理を保持し、処理の再開(resume)を明示的に行える ◦ 実装を見ているとCompletion Handlerに似てる気がする • 再開(resume)は一度しか呼べない • withCheckedContinuation
◦ 呼び出しが一度だけかどうか、呼び出し忘れていないかどうかを実行時にチェックしてくれる ◦ 2度呼び出した場合はクラッシュ (CONTINUATION MISUSE) • withUnsafeContinuation ◦ 呼び出しが一度だけか、呼び出し忘れがないかのチェックがない ◦ 2度呼び出した場合はクラッシュ (EXC_BAD_ACCESS) ◦ SDKなどでのパフォーマンス効率化以外では極力使用しない
Continuationを使う例 以下の処理を考える • PeerManagerの syncSharedPostメソッドを呼び出す • 返却値かエラーをDelegateメソッドを介して受け取る 上記ををasync / await
を使用した形に書き換える
メソッド呼び出しの結果を delegateメソッド経 由で受け取る
メソッド呼び出しに関する Continuationをクラ スのプロパティに保持する ( CompletionHandlerを保持するのと似てる )
Delegateメソッドに値が返ってきたタイミング で結果とともにcontinuationのrsumeを呼 ぶ continuationは1度しかresumeできないた め保持していたcontinuationは破棄する
まとめ • async / await で非同期処理がシンプルにかける • getter, for文 initializer,
subscript etcで使える • completionHandler の async / await への置き換え • Delegationメソッドのasync / awaitへの置き換え • 複数のSDKにすでに導入済み • Continuationについて • セッションにはなかったですが、 iOS15以上でないと使用できないようです