Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

session 9 の実装 #10

Merged
merged 4 commits into from
Jan 22, 2024
Merged

session 9 の実装 #10

merged 4 commits into from
Jan 22, 2024

Conversation

askldfghj
Copy link
Collaborator

@askldfghj askldfghj commented Jan 16, 2024

概要

session 9 の課題を実装しました。

セッションリンク

https://github.com/yumemi-inc/ios-training/blob/main/Documentation/ThreadBlock.md

変更点

  • UIActivityIndicatorView の表示

スクリーンショット

sesson_9

@askldfghj askldfghj requested a review from a team January 16, 2024 04:45
@askldfghj askldfghj changed the title session 9 ㅜㅐ session 9 の実装 Jan 16, 2024
@@ -44,6 +46,8 @@ final class HomeViewController: UIViewController {
}

func loadWeatherData() {
indicator.startAnimating()
reloadButton.isEnabled = false
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

データロード中はタップを防ぐ

@@ -44,6 +46,8 @@ final class HomeViewController: UIViewController {
}

func loadWeatherData() {
indicator.startAnimating()
Copy link
Member

@novr novr Jan 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[imo] MVPはPassive Viewパターンなので、Passive ViewはViewが受動的(Passive)で能動的ではない
あくまでViewは受け身でありPresenterがViewに値をセットしたりする、自分で値をセットしたりしない方針かと思います
ただ、研修としての課題ではないので対応自体はどちらでもOKです 🙇

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@novr
なるほど。 View だからと言って View を操作してもいいということではないのですね。
d83e59d
上記のコミットで output の関数を追加して、 prsenter で View の表示を操作する方向で修正してみました。いかがでしょうか。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imho-badge

インジケーターの表示開始が HomePresenter から HomePresenterOutput に showLoadingUI で直接的に指示されるのに対して、その非表示が HomePresenterOutput の updateInfoDisplayshowAlertControllerByError 内で自発的に(感じる)タイミングで実施されるのが、なんとなく気になりました。

上記で登場したどのメソッドも HomePresenterOutput に規定されているものであるのを踏まえると、現状の動きも自分がただ違和感を覚えるだけで妥当なのかもしれないですが、自分なりに考えてみると —

imo-badge

たとえば HomePresenterOutput の定義を、次のようなものにしてみる手もあるかもしれません。こうすると対がわかりやすくなりそうなのと、どこか iOS でいう Delegate パターンで馴染みある見た目にも近づきます。

protocol HomePresenterOutput {
   func weatherDidStartLoading()
   func weatherDidFinishLoading(_ result: Result<WeatherResponse, Error>)
}

ただ、MVP として見たときには View に対する指示が不明瞭な感じもするので、上記も少しばかり考慮しつつ、適切な方法を模索してみても良いかもしれない印象でした。現状と同じように HomePresenterOutput に hideLoadingUI を定義してそれを HomePresenter から適切なタイミングで指示する方法もあるかもしれないです。

@novr novr requested review from a team and removed request for a team January 17, 2024 00:39
Copy link
Member

@ykws ykws left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

テストパスすることの確認をお願いします!
(すみません、課題の内容にその旨追記するようにしました)

@askldfghj
Copy link
Collaborator Author

@ykws
コメントありがとうございます。
確かに HomePresenterOutput に関数を追加したのが影響し、テストのビルドが通らなくなっていました。
f71f09c
上記のコミットで対応しました。
非同期の対応は元々実装を非同期を想定していたので、 session 8 でそれに基づいた実装を行いました。

また、テストを毎回確認するより CI がいた方が良さそうだったので、 actions を使うことをやってみました。
#11

https://zenn.dev/yumemi_inc/articles/xctest-github-actions
ちょうどこの記事を参考にしていましたが、ローカルではプロジェクトが見つからないというのと、マージされてないので actions タブで結果が見れなく困ってました。
時間あるときレビューしていただけると助かります。

@askldfghj askldfghj requested a review from ykws January 18, 2024 23:54
Copy link
Member

@ykws ykws left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@es-kumagai
Copy link
Contributor

es-kumagai commented Jan 21, 2024

lgtm-badge

非同期を先取りして実装されているため無意味な指摘になりますけれど、HomePresenter の loadWeatherData で使う API を処理の重たいものに変えても何も影響を受けないところが面白かったです。

nits-badge

ただし仮に「スレッドブロック」の課題に純粋に取り組んだとしたとき、WeatherModelInputfetchWeatherData(request:) async throws が「async」指定で非同期呼出を求めてしまうため、ここでスレッドブロックの API が実質的に非同期 API として吸収されてしまうのが気になりました。

問題はないのですが、一般的な視点で「非同期処理を必要としない YumemiWeather.syncFetchWeather(json:) throws をほぼ単純にラップする WeatherModel.fetchWeatherData(request:) async throws で非同期メソッドとして備えるところが、何も間違いはないのですが、些か過剰な強化のようにも感じます。ここの async をなくしてコードの変化を見てみても面白いかもしれないです。

@askldfghj
Copy link
Collaborator Author

@es-kumagai
コメントありがとうございます。
確かに課題としては過剰かもしれないですが、これでメインスレッド止まったらダメだろ。。という気持ちでした。(そのためあらかじめ非同期の仕組みを見ていました)
そしてローカルで async を削除して動きを見てみました。予想通り何もタップできない状態で、ロード中にタップした close が通信終了後に反応して、なるほど、と思いました。

@askldfghj
Copy link
Collaborator Author

@novr @ykws @es-kumagai
レビューありがとうございます。こちらマージします。

@askldfghj askldfghj merged commit 42cc717 into main Jan 22, 2024
@askldfghj askldfghj deleted the session/9 branch January 22, 2024 01:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants