iOS设计模式与架构02-MVC-Apple

大家肯定都听过MVC这种架构,首先我们来看下Apple版的MVC是什么样的,就是Apple官方所说的MVC是一个什么样的方案,我们可以看到MVC其实就是三个角色,ModelViewController,那这三个角色之间是一个什么样的关系呢,如果是Apple官方的MVC的话,大概是这个样子的
Model-View-Controller

  • 首先Controller是持有View的,View也会通知Controller去处理一些业务逻辑,
  • 其次Controller也持有Model,当Model变化时(比如加载网络数据了等等),Controller是知道的,所以又把最新的数据显示到View
  • 最后其实ControllerModelView中间的一个桥梁,那我们可以看到Apple版的MVC的一个特点就是View和Model之间是没有关联的,View不知道Model的存在,Model也不知道View的存在,那大家最熟悉的应该就是我们神奇万能UITableView了,UITableView算是把Apple版MVC发挥的淋漓尽致

实例

接下来我们用一个简单的例子来说明下,我们新建一个项目,比如是一个新闻类的项目,本地简单的模拟下网络加载数据然后展示到TableView上,我们首先创建一个XXNewsModel

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

,接着创建一个XXNewsViewController继承自UITableViewController

@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

我们运行下项目来看看,数据显示出来了,
截图

我们来看看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了,接下来我们可以总结下这个架构的优缺点

优缺点

  • 优点:ViewModel可重复利用,(这也解释了TableView为啥这么万能:不关心Model,比如我们显示个商品的列表,只需换下Model,然后赋值对应的控件就行了,而不用换TableView

    • 大家如果自定义View的时候想做的复用性很强的话,可以操考下TableView的设计
  • 缺点:Controller的代码过于臃肿

总结一下

架构这种东西呢,不是我三言两语能说清楚的,我在这里写的也只是些概念、Demo,还是需要大家多思考,多练习,不断的积累项目经验,才能悟出来更高的更深层次的东西

今天先到这里,明天接着更新MVC-变种

One More Thing

喜欢的朋友可以扫描关注我的公众号(您的支持是我写作的最大动力)
iOS_DevTips

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值