iOSのCombine/SwiftUIや、AndroidのJetpackComponentなど、宣言的記法を利用したパラダイムがモバイルアプリ開発で当たり前になろうとしている。 考え方をそもそも変えないといけない場面が出そうなので、gistに残しておく。今はただの考えにすぎないので、実装出来てきたらレポジトリやQiitaで公開する
今まではRepositoryに対してgetを投げて、非同期のクロージャで結果を返して...。のようにしていたが、
宣言的パラダイムでは変更はSubscribeしており、流れきてたら自動で更新がなされる。get
のようなリクエストを送ることはない。
実現のためにポーリングなどが必要な場合も、データレイヤーでカプセル化する。
- の変更はやってくるを考慮すると、UIKit時代のviewDidLoadやviewWillAppearに頼った実装は必要がなくなる。 ライフサイクルに頼らず、自分が監視しているオブジェクトや値に変更があれば自身の更新を行う。
UIKit時代はMediatorとしてControllerが役割を持っており、これをMVPにしようがMVVMにしようが「どこかが画面上のリクエストを一身に受けて、周りへ流す」 という役割のオブジェクトが必要なことに変わりはなかった。これはライフサイクルがもたらすフォースを受けており、仕方ない問題であったが、 SwiftUIではBindingやEnvironmentなどを利用してSingle Source of Truthを実現することで、Viewが自律的に自分の興味のあるデータを監視し自信を更新する。 つまり中央集権をやめて自立分散管理のアプローチを取る方がいいだろう。
画面を跨いだデータの変更は自動で伝搬される。