iOSはviewControllerの粒度を減らします

ビジネスコードが増えると、ビューコントローラはますます肥大化し、その後のメンテナンスが困難になります。追加または変更するたびに、元のベースで追加または変更するのが最も簡単な方法ですが、これは正しくありません。もちろん、変更するたびに一度再構築する必要があります。理想的ですが、現実的ではありません。この記事では、読み取り能力を低下させることなく、各クラスのコード量を削減するためのさまざまなアーキテクチャパターンについて説明します。

従来の開発手順では、新しいvieControllerを作成し、インターフェイスリクエストを介してデータをデータモデルにカプセル化し、テーブルビューのセルにレンダリングします。viewControllerは、データの取得と処理、およびページの読み込みを行います。表示、および相互作用ロジック。全体的なコードはすべてviewControllerスーペリアにあります

1.MVC

24c32d90d20161bd813bc80e73aaae29〜tplv-t2oaga2asx-zoom-in-crop-mark-1304-0-0-0.image.png

MVCモードでは、データ取得、カプセル化、および処理ロジックをモデルに配置し、ビュー関連をビューに配置できます。コントローラーは、データ同期とビュー操作イベントを処理するだけで済み、コードの量を減らすことができます。コントローラー、ビューとモデルも再利用できますが、MVCにも問題があります

例は次のとおりです

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    BlogCellHelper *cellHelper = self.blogs[indexPath.row];
    BlogTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ReuseIdentifier];
    cell.title = cellHelper.blogTitleText;
    cell.summary = cellHelper.blogSummaryText;
    cell.likeState = cellHelper.isLiked;
    cell.likeCountText = cellHelper.blogLikeCountText;
    cell.shareCountText = cellHelper.blogShareCountText;

    //点赞的业务逻辑
    __weak typeof(cell) weakCell = cell;
    [cell setDidLikeHandler:^{
        if (cellHelper.blog.isLiked) {
            [self.tableView showToastWithText:@"你已经赞过它了~"];
        } else {
            [[UserAPIManager new] likeBlogWithBlogId:cellHelper.blog.blogId completionHandler:^(NSError *error, id result) {
                if (error) {
                    [self.tableView showToastWithText:error.domain];
                } else {
                    cellHelper.blog.likeCount += 1;
                    cellHelper.blog.isLiked = YES;
                    //点赞的业务展示
                    weakCell.likeState = cellHelper.blog.isLiked;
                    weakCell.likeCountText = cellHelper.blogTitleText;
                }
            }];
        }
    }];
    return cell;
}
复制代码

同様の関数は、セルのボタンイベントを介してデータソースを変更します。これは、ビューレイヤーとモデルレイヤーを結合しますが、期待するビューとモデルを分離するという目的を達成することはできません。さらに、複雑なインターフェイスや複雑なデータ処理の場合、ビュー、モデルは肥大化します。

2.MVP

MVCの欠点は、ビジネスロジックとビジネスプレゼンテーションを区別しないことです。これは、単体テストには非常に不向きです。MVPは、上記の欠点に合わせて最適化されています。また、ビジネスロジックとビジネスプレゼンテーションを分離し、対応するものがMVCPになります。

MとVの機能は変更されておらず、元のCはレイアウトのみを担当し、すべてのビジネスロジックはP層に転送されます。P層がビジネスロジックを処理した後、ビューの表示を変更する場合は、コールバックを介して実装できます。これにより、結合を減らし、P層のビジネスロジックを個別にテストできます。

a44d75112269aac5568317023c166ba8〜tplv-t2oaga2asx-zoom-in-crop-mark-1304-0-0-0.image.png

b0ba97a831a1c5a3d2277dc8b782dec0〜tplv-t2oaga2asx-zoom-in-crop-mark-1304-0-0-0.image.png

写真からわかるように、MVCに基づいて、viewControllerはビューレイヤーと現在のレイヤーを保持し、現在のレイヤーとモデルレイヤーは相互作用してデータを取得し、データを処理し、プロキシを介してビューレイヤーを表示します。ビューのサブユニットでは、一般的なUITableCellを例にとると、セルはデータモデル全体を取得する必要はありませんが、データモデル内のいくつかの属性値のみが必要です。この場合、Presentのレイヤーセルとデータモデルの間にが追加され、セルとデータモデルが追加されます。データモデルが分離され、セルを本当の意味で再利用できます。

3.MVVM

MVVMはMVPに基づいて開発されているので、なぜこのモードを設計する必要があるのでしょうか?例として、セルボタンをクリックします---> Pの同様のロジックを呼び出します--->同様が成功すると、PはM ---> Pのデータは、セルのプロキシメソッドを呼び出して、セルの表示を変更します(いいねが成功すると、いいねの数が1増え、いいねの数が赤に変わります。それ以外の場合は、いいねの数や色は変わりません)上記はaイベントの全過程が4段階で完了していることがわかり、毎回Pの状態をビューに同期させる必要があります。多くのイベントがありますが、このように書くのは非常に面倒です。動作とビューの状態をPの動作と状態と同期させる簡単なメカニズムはありますか?

答えは、MVVMのバインダーメカニズムです。MVVMは、実装でRACを使用して実装されることが多く、ここでは拡張されません。

ecdf968fe089eb30ca8c74c062a75814〜tplv-t2oaga2asx-zoom-in-crop-mark-1304-0-0-0.image.gif

MVVM各层的职责和MVP的类似,VM对应P层,只是在MVVM的View层多了数据绑定的操作

おすすめ

転載: juejin.im/post/7087592654326186021
おすすめ