Skip to content

fuwamaki/sample-mvvm-ios

Repository files navigation

概要

本リポジトリは、iOSのMVVMアーキテクチャを採用したサンプルコードである。 MVVMアーキテクチャを採用したコードの形は、開発チームによって、人によって異なり、公式で定義されていない。 このリポジトリのMVVMは、以下のサイト・本などに参考にし、独自に定義したものである。

このリポジトリはあくまでMVVMの一例であり、これを見た人で意見があれば、ぜひissueでコメントして欲しい。

MVVMアーキテクチャについて

iOSのMVVMとは、Model, ViewController, ViewModelの3つの層に分けた、 アーキテクチャ構造のことを指す。

本リポジトリでは、以下の図の構造を意識している。

MVVM

以下補足。

  • ViewController層: UI層。画面遷移などUI操作を行うが、ロジックは持たない。ViewControllerだけでなく、Viewクラスも含む。
  • ViewModel層: UI層のビジネスロジックを持ち、加えてModel層のデータ連携ロジック(API取得データをローカルに保存するなど)を持つ層。Model層のビジネスロジックをUseCase層が持つMVVMアーキテクチャのケースもあるが、UseCase層があると頻繁にコード内容が薄くなり、レイヤーが増えるのでコード全体でみると見通しが悪くなりかねないので、本リポジトリではViewModel層に統合する形を採用した。UnitTestの対象。
  • Model層: データの管理や操作を行う層。
    • Entity: オブジェクトクラス。UnitTestの対象。
    • Repository: ローカルデータの読込・検索・削除・更新などを行うクラス。UnitTestの対象。
    • APIClient: APIアクセスを行うクラス。
  • DIについて: ViewModelをテストしやすくするために、ViewModelのInitializerにはDIを採用している。Mockの指定を行う場合は、MockインスタンスをViewModelのInitializer変数に適用する。

※注意点: ViewModel層では、ViewControllerの状態を知らない。そのため、ViewControllerのインスタンスも持たないようにする。

実現している機能

MVVMアーキテクチャを採用したシステム、以下の機能を実現している。

1. Itemの取得・追加・削除・更新

APIのGET・POST・DELETE・PUTを学ぶために。

  • Itemの一覧表示・削除: ItemViewControllerなど
  • Itemの登録・更新: ItemRegisterViewControllerなど
アイテム一覧 アイテム登録 アイテム削除 アイテム更新

2. 並列処理で複数のAPI取得

複数のAPIの扱いを学ぶために。 Githubのリポジトリ一覧取得APIでお気に入り登録したもの、 Qiitaの記事一覧取得APIでお気に入り登録したものを、まとめて一覧で表示する。

  • GithubリポジトリとQiita記事のお気に入り表示: ListViewControllerなど
  • Githubのリポジトリ一覧取得とお気に入り登録: GithubViewControllerなど
  • Qiitaの記事一覧取得とお気に入り登録: QiitaViewControllerなど
お気に入りリスト Github検索 Qiita検索

3. 新規登録・ログイン

ローカルデータの扱いを学ぶために。 新規登録・ログインは、UrlSchemeとUniversalLink周りも学べるLINEログインを採用した。

  • 新規登録・ログインへの導線、ユーザ情報の表示: MypageViewControllerなど
マイページ 未ログイン マイページ ログイン済み ユーザ情報入力

使用ライブラリ

具体的なコードの説明

詳しい説明はReadmeには記載しない。 コードにコメントを書いたりしているので、コードを見て欲しい。

About

iOS mvvm sample app, with Rx and UIKit.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published