ビジネスコードが増えると、ビューコントローラはますます肥大化し、その後のメンテナンスが困難になります。追加または変更するたびに、元のベースで追加または変更するのが最も簡単な方法ですが、これは正しくありません。もちろん、変更するたびに一度再構築する必要があります。理想的ですが、現実的ではありません。この記事では、読み取り能力を低下させることなく、各クラスのコード量を削減するためのさまざまなアーキテクチャパターンについて説明します。
従来の開発手順では、新しいvieControllerを作成し、インターフェイスリクエストを介してデータをデータモデルにカプセル化し、テーブルビューのセルにレンダリングします。viewControllerは、データの取得と処理、およびページの読み込みを行います。表示、および相互作用ロジック。全体的なコードはすべてviewControllerスーペリアにあります
1.MVC
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層のビジネスロジックを個別にテストできます。
写真からわかるように、MVCに基づいて、viewControllerはビューレイヤーと現在のレイヤーを保持し、現在のレイヤーとモデルレイヤーは相互作用してデータを取得し、データを処理し、プロキシを介してビューレイヤーを表示します。ビューのサブユニットでは、一般的なUITableCellを例にとると、セルはデータモデル全体を取得する必要はありませんが、データモデル内のいくつかの属性値のみが必要です。この場合、Presentのレイヤーセルとデータモデルの間にが追加され、セルとデータモデルが追加されます。データモデルが分離され、セルを本当の意味で再利用できます。
3.MVVM
MVVMはMVPに基づいて開発されているので、なぜこのモードを設計する必要があるのでしょうか?例として、セルボタンをクリックします---> Pの同様のロジックを呼び出します--->同様が成功すると、PはM ---> Pのデータは、セルのプロキシメソッドを呼び出して、セルの表示を変更します(いいねが成功すると、いいねの数が1増え、いいねの数が赤に変わります。それ以外の場合は、いいねの数や色は変わりません)上記はaイベントの全過程が4段階で完了していることがわかり、毎回Pの状態をビューに同期させる必要があります。多くのイベントがありますが、このように書くのは非常に面倒です。動作とビューの状態をPの動作と状態と同期させる簡単なメカニズムはありますか?
答えは、MVVMのバインダーメカニズムです。MVVMは、実装でRACを使用して実装されることが多く、ここでは拡張されません。
MVVM各层的职责和MVP的类似,VM对应P层,只是在MVVM的View层多了数据绑定的操作