Taskの強参照に要注意! UIKitとSwiftUIでの比較

>100 Views

October 09, 25

スライド概要

2025年10月10日に開催される「DroidKaigi & iOSDC After Talks Night」で使用する資料です。
イベント詳細:https://yumemi.connpass.com/event/366704/

profile-image

ウェルスナビ株式会社 技術広報チームの公式アカウントです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Taskの強参照に要注意! UIKitとSwiftUIでの⽐較 ウェルスナビ株式会社 深来 ⽇菜/ ひなっこ DroidKaigi & iOSDC After Talks Night 1

2.

⾃⼰紹介 深来 日菜 (Fukagi Hina)~ひなっこ ~ ウェルスナビ株式会社 サービス機能開発 / iOS エンジニア ウェルスナビでは ● 2025年3⽉⼊社 ● WNのモバイルアプリ開発・テックブログ運営 ひとこと ● ウェルスナビに入社する前は銀行で営業をしていました! 2 @2025 WealthNavi Inc.

3.

資産運用ロボアドバイザー 「 WealthNavi 」 3 ※ ⼀般社団法⼈⽇本投資顧問業協会「契約資産状況(最新版)(2025年3⽉末現在) 『ラップ業務』『投資⼀任業』」を基にネット専業業者を⽐較 ウエルスアドバイザー 社調べ(2025年6⽉時点) ※ 画⾯はイメージです。

4.

アジェンダ 1. 独自のアーキテクチャについて 2. Taskによる強参照がもたらした予期せぬ挙動 3. 原因 4. 解決方法 5. SwiftUI化による今後 4 @2025 WealthNavi Inc.

5.

1. 独自のアーキテクチャについて 2. Taskによる強参照がもたらした予期せぬ挙動 3. 原因 4. 解決方法 5. SwiftUI化による今後 6. 5 @2025 WealthNavi Inc.

6.

ウェルスナビアプリのアーキテクチャ 単⽅向データフローの独⾃アーキテクチャを採⽤ View Command Action State ViewStore dispatchCommand Middlewares (RequestService、 ○○Manager、etc…) effect action command View (ViewController) dispatchAction PublishRelay <Effect> state BehaviorRelay <State> @2025 WealthNavi Inc.

7.

ウェルスナビアプリのアーキテクチャ SwiftUI版 HostingController ViewStore: ObservedObject dispatchCommand Middlewares (RequestService、 ○○Manager、etc…) effect action command SwiftUI.View dispatchAction AsyncStream <Effect> state @Published State @2025 WealthNavi Inc.

8.

独⾃のアーキテクチャのメリット ● 画面の状態とビジネスロジックが切り離されている ○ ● 同じStateを流せば必ず同じ画面になる ○ ● ViewStoreのモックが非常にシンプルに Stateを用意してあげるだけでスナップショットテストが作れる SwiftUIとの相性が良い 8 @2025 WealthNavi Inc.

9.

1. 独自のアーキテクチャについて 2. Taskによる強参照がもたらした予期せぬ挙動 3. 原因 4. 解決方法 5. SwiftUI化による今後 9 @2025 WealthNavi Inc.

10.

Taskによる強参照がもたらした予期せぬ挙動 予期せぬ挙動 ホーム画面からポートフォリオの詳細画面に遷移後、 API通信の読み込みが完了する前にホーム画面に戻ると、 ホーム画面でもローディングが残ってしまうという問題が発生 ※画像はイメージです 10 @2025 WealthNavi Inc.

11.

1. 独自のアーキテクチャについて 2. Taskによる強参照がもたらした予期せぬ挙動 3. 原因 4. 解決方法 5. SwiftUI化による今後 11 @2025 WealthNavi Inc.

12.

原因 原因 API通信完了後にはdeinitが呼ばれるが、 API通信の途中でホーム画⾯に戻ってしまうと、 deinitが呼ばれていない そのためtaskがキャンセルされない (ホーム画⾯に戻ってもローディングが残る) 12 @2025 WealthNavi Inc.

13.

原因 deinitが呼ばれない理由 Taskクロージャ内では暗黙的に self(ViewStore)をキャプチャしており、そのた めTaskクロージャが終了するまではselfへ の強参照を持ち続ける 13 @2025 WealthNavi Inc.

14.

原因 deinitが呼ばれない理由 API通信中はTaskからViewStoreへの参照カウントは解放されず、参照カウントはゼロにならない ので、インスタンスはARCによって割り当て解除されず、強参照が残っている 14 @2025 WealthNavi Inc.

15.

1. 独自のアーキテクチャについて 2. Taskによる強参照がもたらした予期せぬ挙動 3. 原因 4. 解決方法 5. SwiftUI化による今後 15 @2025 WealthNavi Inc.

16.

解決⽅法 PortfolioViewController PortfolioViewControllerのviewWillDisappearで dispatchCommand(.cancelTask)コマンドを送信す ることで、明⽰的にタスクをキャンセルする実装に 変更 16 @2025 WealthNavi Inc.

17.

解決⽅法 PortfolioViewStore dispatchCommand(.cancelTask)コマンドで新しいtaskが ⽣成されると、ポートフォリオ画⾯が表⽰された直後に呼 ばれるdispatchCommand(.fetch)コマンドで⽣成されてい た古いtaskと⼊れ替わってしまい、本来キャンセルした かった古いtaskがキャンセルできない問題が発⽣する didSetを使⽤し、古いtaskをキャンセルするように実装 17 @2025 WealthNavi Inc.

18.

対応後 強参照が解消 ポートフォリオの詳細のAPIの読み込みが完了する前に ホーム画⾯に戻った場合でもローディングも消えるよう改善 ※画像はイメージです 18 @2025 WealthNavi Inc.

19.

1. 独自のアーキテクチャについて 2. Taskによる強参照がもたらした予期せぬ挙動 3. 原因 4. 解決方法 5. SwiftUI化による今後 19 @2025 WealthNavi Inc.

20.

SwiftUI化による今後 SwiftUI × Swift Concurrencyのコード に段階的にリファクタリング SwiftUIのtaskにはタスクが完了する前に ビューが⾮表⽰になると、⾃動的にタスク をキャンセルしてくれる機能がある 今回のUIKitのタスクがキャンセルされ ず、ローディングが残ることを防ぐことが 可能 20 @2025 WealthNavi Inc.

21.

【重要な注意事項】 ● 本資料は、断定的判断を提供するものではなく、情報を提供することのみを⽬的としており、いか なる種類の商品も勧誘するものではありません。最終的な決定は、お客様⾃⾝で判断するものと し、当社はこれに⼀切関与せず、また、⼀切の責任を負いません。 ● 本資料には将来の出来事に関する予想が含まれている場合がありますが、それらは予想であり、ま た、本資料の内容の正確性、信頼性、完全性、適時性等を⼀切保証するものではありません。本資 料に基づいて被ったいかなる損害についても、当社は⼀切の責任を負いません。また、当社は、新 しい情報や将来の出来事その他の情報について、更新⼜は訂正する義務を負いません。 ● 本資料を利⽤することによりお客様に⽣じた直接的損害、間接的損害、派⽣的損害その他いかなる 損害についても、当社は⼀切の責任を負いません。 商号等:ウェルスナビ株式会社 金融商品取引業者 関東財務局長(金商) 第2884号 加入協会:日本証券業協会 一般社団法人日本投資顧問業協会 21 @2025 WealthNavi Inc.

22.

ご清聴ありがとうございました 22 @2025 WealthNavi Inc.

23.

Appendix 1 定期的にWealthNaviの開発(技術‧組織)に関する情報を発信しています。 開発者ブログ ● 技術広報に関する お問い合わせ先 ● https://zenn.dev/p/wn_engineering ブックマーク追加や記事への「いいね」していただけると嬉しいです ウェルスナビ 技術広報チーム([email protected]) 23 @2025 WealthNavi Inc.

24.

Appendix 2 ウェルスナビでは複数の開発系ポジションで採⽤を強化しています。 主な採⽤中職種 ● ● ● ● ● モバイル開発エンジニア エンジニアリングマネージャー バックエンド開発エンジニア QAエンジニア データエンジニア 採⽤情報詳細 ● 下記URL(QRコード)よりご確認ください。 https://recruit.wealthnavi.com/ 採⽤に関する お問い合わせ先 ● ● 「カジュアルに話を聞いてみたい」という温度感でも構いません。 ウェルスナビ採⽤チーム([email protected])までご連 絡お待ちしております。 24 @2025 WealthNavi Inc.