iOS設計模式與架構02-MVC-Apple

大家肯定都聽過MVC這種架構,首先我們來看下Apple版的MVC

是什麼樣的,就是Apple官方所說的MVC是一個什麼樣的方案,我們可以看到MVC其實就是三個角色,Model,View,Controller,那這三個角色之間是一個什麼樣的關係呢,如果是Apple官方的MVC的話,大概是這個樣子的

iOS設計模式與架構02-MVC-Apple

Model-View-Controller


  • 首先Controller是持有View的,View也會通知Controller去處理一些業務邏輯,
  • 其次Controller也持有Model,當Model變化時(比如加載網絡數據了等等),Controller是知道的,所以又把最新的數據顯示到View上
  • 最後其實Controller是Model和View中間的一個橋樑,那我們可以看到Apple版的MVC的一個特點就是View和Model之間是沒有關聯的,View不知道Model的存在,Model也不知道View的存在,那大家最熟悉的應該就是我們神奇萬能的UITableView了,UITableView算是把Apple版的MVC發揮的淋漓盡致

實例

接下來我們用一個簡單的例子來說明下,我們新建一個項目,比如是一個新聞類的項目,本地簡單的模擬下網絡加載數據然後展示到TableView上,我們首先創建一個XXNews的Model

<code>@interface XXNews : NSObject
@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSString *content;
@end/<code>

,接著創建一個XXNewsViewController繼承自UITableViewController

<code>@interface XXNewsViewController ()
@property (strong, nonatomic) NSMutableArray *newsData;
//@property (strong, nonatomic) NSMutableArray *shopData;

@end

@implementation XXNewsViewController
- (void)viewDidLoad {
[super viewDidLoad];

[self loadNewsData];
// [self loadShopData];
}

// 本地模擬網絡加載
- (void)loadNewsData
{
self.newsData = [NSMutableArray array];

for (int i = 0; i < 20; i++) {
XXNews *news = [[XXNews alloc] init];
news.title = [NSString stringWithFormat:@"news-title-%d", i];
news.content = [NSString stringWithFormat:@"news-content-%d", i];
[self.newsData addObject:news];
}
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.newsData.count;
}

#pragma mark - Table view data source
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"NewsCell" forIndexPath:indexPath];

XXNews *news = self.NewsData[indexPath.row];

cell.detailTextLabel.text = news.content;
cell.textLabel.text = news.title;

return cell;
}
@end/<code>

我們運行下項目來看看,數據顯示出來了

iOS設計模式與架構02-MVC-Apple

我們來看看MVC三個角色,

  • Model(News),
  • View(TableView),
  • Controller(XXNewsViewController),

那我們來驗證下這個MVC跟我們上面說的是否一致

我們看到XXNewsViewController擁有newsData(可以創建,加載這些模型數據),而且XXNewsViewController也擁有View(TableView),然後,View(TableView)是不知道這個Model(News)的存在的,Model(News)也不知道View(TableView)的存在,

那View是如何顯示Model的數據的呢?全靠Controller這個橋樑把Model的數據取出來,然後賦值給View對應的控件上,所以跟我們上面說的是一致的,這個呢就是Apple版的MVC了,接下來我們可以總結下這個架構的優缺點

優缺點

  • 優點:View和Model可重複利用,(這也解釋了TableView為啥這麼萬能:不關心Model,比如我們顯示個商品的列表,只需換下Model,然後賦值對應的控件就行了,而不用換TableView)大家如果自定義View的時候想做的複用性很強的話,可以操考下TableView的設計
  • 缺點:Controller的代碼過於臃腫

總結一下

架構這種東西呢,不是我三言兩語能說清楚的,我在這裡寫的也只是些概念、Demo,還是需要大家多思考,多練習,不斷的積累項目經驗,才能悟出來更高的更深層次的東西

今天先到這裡,明天接著更新MVC-變種


分享到:


相關文章: