Slide 1

Slide 1 text

僭越ながら、 MVVM🤔 Input Output について考えてみました。 Shichimitoucarashi keisuke yamagishi

Slide 2

Slide 2 text

自己紹介 名前:山岸恵介 iOSエンジニア Github: https://github.com/keisukeYamagishi HP: https://sevens-api.herokuapp.com/

Slide 3

Slide 3 text

読みやすく、わかりやすく、管理しやすい コンセプトは

Slide 4

Slide 4 text

まずは ’Input’これは入力される値を渡すわけです が、工学的🧐 学術的🤔、そして抽象的🤩

Slide 5

Slide 5 text

わかりづらいと感じます🤓

Slide 6

Slide 6 text

受信🎉 わかりやすい気がします(主観ですが) なので、 ’Input’は Receive

Slide 7

Slide 7 text

`receive` で定義したサンプルコード protocol ViewModelReceive: AnyObject { func callApi(_ indexPath: IndexPath) }

Slide 8

Slide 8 text

`Output` に関しても、工学的🧐、学術的 🤔、そして抽象的🎉

Slide 9

Slide 9 text

やっぱりこちらもわかりづらいと感じます😇

Slide 10

Slide 10 text

なので😇 例えばですが、 画面遷移を伴うものは、 `route` で定義 UIに変化を反映させる場合は、 `ui` で定義。

Slide 11

Slide 11 text

routeのサンプルコード protocol ViewModelRoute: AnyObject { func detail(_ result: @escaping (Data?, String, HTTPURLResponse?, Error?) -> Void) func transition(_ callBack: @escaping () -> Void) }

Slide 12

Slide 12 text

uiのサンプルコード protocol ViewModelUI: AnyObject { func progress(_ handler: @escaping ((Float) -> Void)) }

Slide 13

Slide 13 text

ViewController側の実装🦾 viewModel.route.detail { [unowned self] data, str, res, error in self.detail(data: data, param: str, response: res, error: error) } viewModel.route.transition {[unowned self] in self.detailViewController(isDL: true) } viewModel.ui.progress { percentage in self.progressView.progress = percentage } viewModel.receive.callApi(indexPath)

Slide 14

Slide 14 text

まとめ この書き方については、「Nuke」の作者の「Alex Grebenyuk」のtweetをみて自分なりに作成してみまし た。 https://github.com/kean https://twitter.com/a_grebenyuk サンプルが下記になります。興味のある方はみていただけますと幸いです。 https://github.com/Jelly-and-removes/HttpSession/tree/feature/new-architectur e 使う人がわかりやすい事を念頭におく事が大事だと考えるので、このよう な考え方は良いと考え、この場をお借りして、発言させていただきました。 皆様のご意見、ご感想をいただけますと非常に幸いでございます。 以上となります。

Slide 15

Slide 15 text

ご静聴いただき誠にありがとうございました。 🎉