Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Swift Concurrency入門
Search
Sato Takeshi
February 22, 2022
Technology
5.7k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swift Concurrency入門
集まれSwift好き!Swift愛好会 vol.65 @ オンライン
https://love-swift.connpass.com/event/238725/
発表資料
Sato Takeshi
February 22, 2022
More Decks by Sato Takeshi
See All by Sato Takeshi
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
80
まさかのバグ!SwiftUIプレビューでハマった国際化対応の落とし穴
satotakeshi
0
440
Swift愛好会 の 思い出
satotakeshi
0
150
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3.1k
Meet passkeys
satotakeshi
2
440
What's new in Vision
satotakeshi
0
2.5k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
490
Xcodegenを個人アプリに導入
satotakeshi
3
950
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.3k
Other Decks in Technology
See All in Technology
2026-09-10 【Snowflake World Tour Tokyo 2026】dbt Core と Snowflake で実現する多層的なデータガバナンス / Multi-Layered Data Governance Powered by dbt Core and Snowflake
civitaspo
0
370
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
700
あるけみー式LTスライド作成術
alchemy1115
1
210
GoCon2026 - Open Source, Open World
sanposhiho
4
3.8k
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
120
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
140
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
350
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
1.1k
クロスボーダーM&AのValue Upを支えるプロダクト開発。日米チームのハブになったプロダクトエンジニアの実践 / Product Engineering Conference 2026
genda
0
120
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
4
550
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
130
2026_devsumi_ozono.pdf
o3
3
460
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
530
Building Adaptive Systems
keathley
44
3.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
A better future with KSS
kneath
240
18k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.9k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
Ethics towards AI in product and experience design
skipperchong
2
370
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Between Models and Reality
mayunak
4
450
Transcript
Swift Concurrency 入門 2022 年 2 月 22 日 集まれ
Swift 好き! Swift 愛好会 vol.65 @ オンライン
Who am I • Name • 佐藤タケシ ( さとうたけし )
• Company • Merpay, Inc.(2019/01 ~) • Role • Software Engineer (iOS) • Account • Twitter: @hatakenokakashi • Facebook: 佐藤剛士 • GitHub: SatoTakeshiX
• 一冊で Swift Concurrency の概 要を理解ことを目指して書いて います • まだ執筆中 •
Swift Concurrency は新しい概 念が盛りだくさん • 覚えればあなたの開発がより安 全に、簡単に実装できるように なる 「Swift Concurrency入門」で技術 書典で販売予定
Swift Concurrency • Swift 5.5 から導入 • Xcode 13 から利用可能
• 非同期処理が簡潔、安全に • async/await が Swift にやってき た!
コールバックによる 非同期処理の 欠点
ネストが深くなる
コールバックの呼び忘れ
コールバックの呼び忘れ コールバックを呼ばないで returnしている
呼び出し元で不具合発生 コールバックが呼ばれないので、 エラーが起きているのに、 ローディングビューがずっと出しっぱな しになるかもしれない
async/awaitで解決
async/awaitで非同期処理 • async で非同期関数を定義
async/awaitで非同期処理 • 呼び出し元
非同期関数 • async がつけられた関数・メソッド • プログラムを待機、再開させる • 通常のコードと同じように記述ができる ◦ 呼び出し元で、変数の代入や
try-catch によるエラーハンドリング ◦ 戻り値を定義できるのでコールバックのよう呼び忘れがない。コンパイルの チェックが入る • スレッドは CPU のコア数分用意される ◦ システムが管理し、開発者が直接触ることはない
awaitでプログラムが待機する
awaitでプログラムが待機する
awaitでプログラムが待機する
順次実行の実装の違い
順次実行をする by 同期関数 ネストが深くなる
順次実行をする by 非同期関数
並列実行の実装の違い
並列実行をする by 同期関数
並列実行をする by 非同期関数
データ競合を防ぐ新しい型 Actor
データ競合(Data Race)とは? • 複数のスレッドがデータに同時にアクセスしたためにデータが不正になる状況 ◦ スレッドの少なくとも一つが値を書き込む 値 スレッド 1 スレッド
2
データ競合(Data Race)
データ競合(Data Race) playgroundで実行すると 110,110が出力される場合がある
actorの特徴 • 新しい型の種類 • 参照型 • インスタンスに外からアクセスは同時にひとつのみに限定される ◦ Actor 隔離(
Actor isolated) と呼ぶ ◦ data race を防ぐ • 外からアクセスする場合は await が必要 • イニシャライザー、プロパティ、メソッド定義、プロトコル適応など class, struct, enum を同じ特徴をもつ
actorでデータ競合を防ぐ
actorでデータ競合を防ぐ 必ず100, 110が順不同で出力される -> データ競合がなくなる
actorで競合状態(Race Condition)は防げない • 競合状態 (Race Condition) マルチスレッドにおける典型的な不具合の一つ • プログラミングの実行結果が各スレッドの実行順に依存する状態 ◦
同じ入力を与えても異なるデータを出力する状態
actorで競合状態(Race Condition)は防げない
actorで競合状態(Race Condition)は防げない
actorで競合状態(Race Condition)は防げない 1. ③、④が同時に呼び出す 2. キャッシュはまだない 3. ③が①に到達。待機 4. ④が①に到達。待機
5. ③が再開。👾を返す。 6. ③が②に到達。 return する 7. ④が再開。🎃を返す。 8. ④が②に到達。 return する 9. ③、④同じ URL なのに違うコ ンテンツが返される=>競合 状態
競合状態(Race Condition)の修正 • await の後でプロパティの チェックする • Protect mutable state
with Swift actorsに Task を使った例もあり
MainActor • メインスレッドで実行される特別な Actor • Global Actor の一種 ◦ むしろメインスレッドのために
Global Actor が提案された ◦ 共有の actor インスタンスを通して Actor 分離がされる • @MainActor で型全部、プロパティのみ、メソッドのみなど適応できる
MainActorの適応方法 • MainActor の適応手順をコードで示す
Task
Task • 並行処理の基本単位。すべての非同期関数は Task を通して実行される • 各 Task を Task
Tree とよばれる親子関係を構築する • Task Tree のおかげでキャンセルや優先度をシンプルにハンドリング可能 ◦ 従来の方法だとあるスレッドの処理がキャンセルされた場合に他のスレッドの処 理に伝播させるのが難しかった
Task Tree • ①一番下位のタ スクがすべて終わ ると上位のタスク が始まる • ②子タスクが終わ ると親タスクに伝
播 • ③親タスクが実行
Task Tree • ①がエラー -> 兄弟 タスクはキャンセ ル② • 上位のタスク③が
キャンセル。兄弟 タスク④もキャン セル • ④の下位タスク⑤ もキャンセル • ⑥親タスクに①の エラー伝播
async letバインディングとTask Tree
async letバインディングとTask Tree 親タスク 子タスク 子タスク
同期関数から非同期関数を呼ぶ方法 Task イニシャライザー • 非同期コンテキストを提供 • 同期関数内から非同期関数を呼べる • コールバックはすぐに呼ばれる •
返り値の Task インスタンスからマニュアルで キャンセルできる • 親タスクの優先度や actor, タスクローカル値 を引き継ぐ Task.detached • 非同期コンテキストを提供 • 同期関数内から非同期関数を呼べる • コールバックはすぐに呼ばれる • 返り値の Task インスタンスからマニュアルで キャンセルできる • 親タスクの優先度や actor, タスクローカル値 を引き継がない
TaskイニシャライザーとTask.detached • Task.detached は MainActor を引き継 がない -> ログ送信な どメインスレッドで不
要な処理に向く • Task は MainActor を 引き継ぐ -> メインス レッドで実行
マニュアルキャンセル • Task のイニシャライザーを保持しておけば、キャ ンセルが必要なときに cancel メソッドでキャンセル できる
キャンセルのハンドリング • checkCancellation: Task が キャンセルされている場合に CancellationError を返す ◦ キャンセルを呼び出し元
に伝える • isCancelled: キャンセルかど うか Bool 値で判断 ◦ キャンセル時追加処理が 可能 独自の追加処理
iOS 13, 14で非同期関数を使う
XcodeのリリースとSwift Concurrency対応状況 • Xcode 13 ◦ 2021 年 9 月
21 日リリース ◦ Swift Concurrency 機能は iOS 15 のみ • Xcode 13.2 ◦ 2021 年 12 月 13 日リリース ◦ Swift Concurrency 機能が iOS 13, 14 にもバックポートされた ◦ ただし Swift パッケージがビルドできない不具合が見つかる • Xcode 13.2.1 ◦ 2021 年 12 月 17 日リリース ◦ Swift パッケージの不具合を修正
iOS 13, 14で非同期関数を使う • 言語機能としての Swift Concurrency 機能は使える • Foundation
での非同期関数は iOS 15 以上 ◦ URLSession の data メソッドなど • withCheckedThrowingContinuation と withCheckedContinuation で既存の コールバック関数を非同期関数にラップができる • アプリサポートバージョンが iOS 15 が下限になるまではラップした関数を呼び出 す
withCheckedContinuation • エラーをスローするしないコールバック関数を非同期関数にラップする • クロージャー内でラップする関数を呼ぶ • ラップする関数のコールバック内で continuation は確実に一回 resume
メソッドを 呼び出す ◦ 呼び出さないのはだめ ◦ 2回以上呼び出すのもだめ
withCheckedContinuation •
withCheckedThrowingContinuation • エラーをスローするコールバック関数を非同期関数にラップする • クロージャー内でラップする関数を呼ぶ • ラップする関数のコールバック内で continuation は確実に一回 resume
メソッドを 呼び出す • resume(returning:) メソッド ◦ ラップした関数の戻り値を引数にする • resume(with: ) ◦ Result 型で返す • continuation.resume(throwing:) ◦ エラー型で返す
withCheckedThrowingContinuation •
まとめ
まとめ • async/await で非同期処理を同期関数のように記述できるようになった • それによって読みやすさが向上し、コールバックの呼び忘れなどのミスを防 げるようになった • マルチスレッドでよくある不具合、データ競合を防ぐ新しい型、 actor
が登場 した ◦ ただし、競合状態はまだ防げない • 非同期処理は Task という単位で行われる • iOS 13, 14 でも Swift Concurrency は使える
参考資料 • Race condition vs. Data Race: the differences explained
• データ競合 (data race) と競合状態 (race condition) を混同しない • Protect mutable state with Swift actors • https://github.com/apple/swift-evolution/blob/main/proposals/0316-glo bal-actors.md • Explore structured concurrency in Swift • Meet async/await in Swift