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
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduc...
Search
darquro
February 16, 2022
Programming
2
4.9k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
『ラクマ x STORES LTイベント ~ iOS開発の裏側 ~』での登壇資料
https://hey.connpass.com/event/236189/
darquro
February 16, 2022
Tweet
Share
More Decks by darquro
See All by darquro
技術的負債を解消してくための組織づくり
darquro
1
920
Jailbreakと向き合おう
darquro
0
2.1k
Half modal comparision in iOS15
darquro
2
1.8k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
100
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
darquro
3
1.6k
iOS View Class Design Basic
darquro
3
730
Swift 5 Exclusivity Enforcement
darquro
4
760
SDK連携を用いたAdMob活用法
darquro
1
980
ContributingSwift
darquro
0
78
Other Decks in Programming
See All in Programming
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
2
7.7k
Alba: Why, How and What's So Interesting
okuramasafumi
0
210
Rubyでつくるパケットキャプチャツール
ydah
0
170
PicoRubyと暮らす、シェアハウスハック
ryosk7
0
220
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
1.3k
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
240
テストコードのガイドライン 〜作成から運用まで〜
riku929hr
7
1.4k
Запуск 1С:УХ в крупном энтерпрайзе: мечта и реальность ПМа
lamodatech
0
950
Androidアプリの One Experience リリース
nein37
0
1.2k
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
770
BEエンジニアがFEの業務をできるようになるまでにやったこと
yoshida_ryushin
0
200
オニオンアーキテクチャを使って、 Unityと.NETでコードを共有する
soi013
0
370
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
34
1.6k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.1k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
30
2.1k
Fireside Chat
paigeccino
34
3.1k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7.1k
The World Runs on Bad Software
bkeepers
PRO
66
11k
Raft: Consensus for Rubyists
vanstee
137
6.7k
A Tale of Four Properties
chriscoyier
157
23k
Why Our Code Smells
bkeepers
PRO
335
57k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
3
180
Transcript
ラクマでのSwiftUI導⼊⽅針とTips @darquro Rakuten Group, Inc.
2 About Me @darquro ラクマ Mobile Application Development Group Manager
/ iOS Engineer
3 Table of Contents • ラクマでのSwiftUI導⼊⽅針 • SwiftUIでハマったこと • SwiftUI
Tips Target 既存のUIKitベースのアプリに これからSwiftUI導⼊していく⼈向け。 ※普段からSwiftUIで開発している⼈には物⾜りないかも 🙇
4 🗼 ラクマでの SwiftUI導⼊⽅針
5 SwiftUI導⼊ • 2021/2〜徐々に導⼊ • 画⾯全体もあれば、 ⼀部コンポーネントのみなど • 追加読み込み(ページング)が 不要(LazyVStackではなくListで
済む) • 複雑な状態管理が不要 という簡単な画⾯から移⾏ 🗼ラクマでのSwiftUI導⼊⽅針
6 Architecture ViewController Presenter UseCase APIClients DataStores Repositories SwiftUI View
ViewModel UseCase Use APIClient directory Use Repository Application Lifecycle Update UIKit(MVP) SwiftUI(MVVM) Presentation Layer Domain Layer Entities System User 🗼ラクマでのSwiftUI導⼊⽅針
7 ViewModel Protocol ViewModel Protocolとしてトレタさんのブログを参考に させていただきました 🙏 https://tech.toreta.in/entry/2019/12/24/104612 🗼ラクマでのSwiftUI導⼊⽅針
8 ViewModel Protocol MVVMアーキテクチャは、 単⽅向Bindingと双⽅向Binding の概念があるが、 SwiftUI+Combine標準APIでは制約はない。 Binding⽅向の制約を設けることで、コード の⾒通しを良くする。 🗼ラクマでのSwiftUI導⼊⽅針
9 ViewModel View ViewModelObject.input • View Lifecycleによる状態更新 • User Actionによる状態更新
🗼ラクマでのSwiftUI導⼊⽅針
10 ViewModel View ViewModelObject.binding • ViewとViewModel双⽅のデータ更新 🗼ラクマでのSwiftUI導⼊⽅針
11 ViewModel View ViewModelObject.output • Fetchされたデータによる画⾯更新 • Status変更による画⾯更新 🗼ラクマでのSwiftUI導⼊⽅針
12 💣 SwiftUIで ハマったところ
13 iOS13/iPadOS13のサポートは切ろう😇 • TextFieldのキーボード⼊⼒まわりの挙動がおかしい • 謎クラッシュ • 標準コンポーネントが⾜りない • Combineのqueueを跨いぐと処理がおかしい
などなどiOS13でSwiftUIを使うのは危険 💣SwiftUIでハマったところ
14 Previewがエラーになって時間ばかり取られる 🤯 Device modelを 定義しておくと便利👍📱 おかしいな…なんか変だなぁ…と感じたら、 • エディタを全部閉じる •
Xcode再起動 • Clean Build • Emulatorの起ち上げ直し • DerivedData削除 最後は諦めてEmulatorで確認 💣SwiftUIでハマったところ ちなみに…
15 if statementを多⽤しない⚠ Xcodeのcode completionがぶっ壊れて まともにコードが書けなくなる 🥺 💣SwiftUIでハマったところ ViewModelでstateのような enumで条件分岐しようとすると…
16 if #available() をViewModifierで使⽤しない💥 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Thread 0
name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 8 SwiftUI 0x00000001a07f2160 partial apply for closure #1 in ModifierBodyAccessor.updateBody+ 6332768 (of:changed:) + 28 9 SwiftUI 0x00000001a0814364 closure #1 in BodyAccessor.setBody+ 6472548 (_:) + 44 10 SwiftUI 0x00000001a07f1a64 ModifierBodyAccessor.updateBody+ 6330980 (of:changed:) + 1440 11 SwiftUI 0x00000001a08144a8 StaticBody.updateValue+ 6472872 () + 208 12 SwiftUI 0x00000001a0517764 partial apply for implicit closure #2 in implicit closure #1 in closure #1 in closure #1 in Attribute.init<A>+ 3340132 (_:) + 28 Xcode13.2 で謎クラッシュが発⽣する。しかもDebugビルドでは発⽣せず、Releaseビルドのみ起こる。 @available()でView単位の出し分けにすることで回避 https://developer.apple.com/forums/thread/697070 💣SwiftUIでハマったところ
17 🎩 🪄 SwiftUI Tips
18 ViewDidLoadModifier⚡ 標準だとonAppearしかないので、deta fetch系処理を⼊れてしまうと画⾯⾏き来する度にリクエストが⾛る。 ViewDidLoadModifierを作ることで、画⾯表⽰の初回のみ呼ばれるイベントを作る。 画⾯表⽰の初回のみ呼ばれる 🎩 🪄SwiftUI Tips
19 Alert Binding ⚡ iOS15からalertのメソッドが変わった。 ただこれらだと、状態とメッセージを別々にbindする必要が出てきて、ViewModel側が冗⻑になってくる。 iOS14 iOS15 🎩 🪄SwiftUI
Tips
20 Alert Binding ⚡ iOS14にはIdentifiableをbindしてalertを出せるメソッドがあった。しかしiOS15ではなくなった。 iOS14 🎩 🪄SwiftUI Tips
21 Alert Binding ⚡ iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🧐 🎩 🪄SwiftUI Tips
22 Alert Binding ⚡ ①ObservableObjectを使ったclassを作成。 iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🎩 🪄SwiftUI Tips
23 iOS15 iOS14 Alert Binding ⚡ ②ViewModifierを作成し、iOS15以降とそれ以前の実装を書く。 ViewModifier内でif #availableで分岐するとcrashする問題があるのでViewModifier単位で分ける。 iOS14とiOS15それぞれの互換性を保ち、
ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🎩 🪄SwiftUI Tips
24 Alert Binding ⚡ ③Viewのextensionを⽤意。 iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🎩 🪄SwiftUI Tips
25 ViewModel View Alert Binding ⚡ ViewModelからメッセージ送るだけ 実装が完結になる iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。
🎩 🪄SwiftUI Tips
26 Viewodel Alert Binding ⚡ iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 ④同じ要領で、.destructiveボタンと.cancelボタンの確認アラートも作成しておくと汎⽤的に使える。 🎩 🪄SwiftUI
Tips
27 さいごに
28 ⾊々⼤変だけど、
29 やっていくしかないですね💪
Thank you 🥳