Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swift Concurrencyでのスケジュール処理を考える / Mobile Act OS...
Search
Yutaro Muta
November 28, 2025
Technology
0
43
Swift Concurrencyでのスケジュール処理を考える / Mobile Act OSAKA 17
Mobile Act OSAKA 17
https://mobileact.connpass.com/event/374447/
Yutaro Muta
November 28, 2025
Tweet
Share
More Decks by Yutaro Muta
See All by Yutaro Muta
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
300
猫と暮らす Google Nest Cam生活🐈 / WebRTC with Google Nest Cam
yutailang0119
0
230
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
270
Apple Vision Pro購入RTA 1泊3日弾丸ハワイツアー / RTA: Purchase Apple Vision Pro in Hawaii
yutailang0119
0
1.5k
個人開発のたのしみ / Enjoying personal development
yutailang0119
0
1k
バックポートして学ぶ新APIの仕組み
yutailang0119
0
3.1k
Backport AsyncImage
yutailang0119
0
750
xcrun Essentials
yutailang0119
6
1.3k
Let's Coding SwiftUI on iPad!
yutailang0119
1
540
Other Decks in Technology
See All in Technology
Bakuraku Engineering Team Deck
layerx
PRO
10
2.4k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
970
進化の早すぎる生成 AI と向き合う
satohjohn
0
470
MySQL AIとMySQL Studioを使ってみよう
ikomachi226
0
130
MCP・A2A概要 〜Google Cloudで構築するなら〜
shukob
0
120
シンプルを極める。アンチパターンなDB設計の本質
facilo_inc
1
820
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
9.8k
IaC を使いたくないけどポリシー管理をどうにかしたい
kazzpapa3
1
210
段階的に進める、 挫折しない自宅サーバ入門
yu_kod
5
2.1k
Dify on AWS の選択肢
ysekiy
0
120
AI エージェント活用のベストプラクティスと今後の課題
asei
2
440
命名から始めるSpec Driven
kuruwic
3
780
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
76
5.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Building Applications with DynamoDB
mza
96
6.8k
How GitHub (no longer) Works
holman
316
140k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
GraphQLとの向き合い方2022年版
quramy
49
14k
Making Projects Easy
brettharned
120
6.5k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
YesSQL, Process and Tooling at Scale
rocio
174
15k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Transcript
Swift Concurrencyでの スケジュール処理を考える id:yutailang0119 / @yutailang0119 2025/11/28 Mobile Act Osaka
17 1
yutailang0119 • 株式会社はてな ◦ @京都オフィス ◦ アプリケーションエンジニア ◦ サービスプラットフォームチーム •
try! Swift Tokyo Organizer ◦ 2026チケット販売中 • AVP座談会 🥽 2
3 Swift Concurrencyの スケジュール処理といえば?
4 https://zenn.dev/treastrain/articles/a78b5f892f4654
🔁 Swift Concurrency 時代の 「n秒ごとに処理を実行する」 • AsyncTimerSequence • AsyncStream +
Task.sleep • ... 5
6 「n秒ごとに処理を実行する」 = タスク開始時点で 全ての時機が決まっている
7 今回のお題
今回のお題 8 • タスク⓪後、タスク ①の時機が決まる ◦ タスク①の実行を予約 • タスク①後、タスク ②の時機が決まる
◦ 処理②の実行を予約 • …
9 https://fortee.jp/iosdc-japan-2025/proposal/292e2ec3-d74b-49a6-a8cb-63c2883d589e
Smart Device Management API 10 • WebRTCセッションの確立 ◦ sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream ◦
ライブストリームのセッション有効期間は5分 ◦ レスポンスに expiresAt がやってくる • セッションを延長可能 ◦ sdm.devices.commands.CameraLiveStream.ExtendWebRtcStream
Smart Device Management API 11 • WebRTCセッションの確立 ◦ sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream ◦
ライブストリームのセッション有効期間は5分 ◦ レスポンスに expiresAt がやってくる • セッションを延長可能 ◦ sdm.devices.commands.CameraLiveStream.ExtendWebRtcStream
今回のお題 12 • セッション確立後、延長タスク ①の時機が決まる ◦ 延長処理①の実行を予約 • 延長処理①後、延長タスク ②の時機が決まる
◦ 延長処理②の実行を予約 • …
13 今回のお題 「Task終了時に次Taskを予約」
14 TaskScheduler
TaskScheduler 15 actor TaskScheduler { private let task: Task<Void, Error>
init(first: Date?) { task = Task { var _next = first while let next = _next { let interval = max(0, next.timeIntervalSinceNow) try await Task.sleep(nanoseconds: UInt64(interval * 1_000_000_000)) try Task.checkCancellation() ... let response = try await client.request(for: request) _next = response.results.expiresAt } } } }
TaskScheduler (汎用化) 16 actor TaskScheduler { private let task: Task<Void,
Error> init(first: Date?, action: @escaping @Sendable () async throws -> Date?) { task = Task { var _next = first while let next = _next { let interval = max(0, next.timeIntervalSinceNow) try await Task.sleep(nanoseconds: UInt64(interval * 1_000_000_000)) try Task.checkCancellation() _next = try await action() } } } }
TaskScheduler 17 • Task内部キャンセルはErrorで表現 • 外からのキャンセルも可能にする ◦ task.cancel() ◦ セッションを止めたら、延長予約もキャンセル
• 実際には expiresAt に実行では遅い ◦ expiresAt?.addingTimeInterval(-60)
18 まとめ
まとめ 19 • スケジューリング用途によって手法は異なる ◦ タスク開始時点で全ての時機が決まっている ◦ 処理後に次のタスク実行タイミングが決まる • Swift
ConcurrencyでのScheduler (Worker) 処理を紹介