TableView之MVVM与MVC之对比

作者: wg689 | 来源:发表于2016-07-07 13:55 被阅读2391次

    1) model

    • model 和MVC 的model 一模一样

    2) View --- TableViewCell

    • TableViewCell 和MVC 的TableViewCell 一模一样

    .h

    #import <UIKit/UIKit.h>
    
    @interface CustomTableViewCell : UITableViewCell
    @property(nonatomic,strong) UILabel *titleLabel;
    @end
    

    .m

    
    #import "CustomTableViewCell.h"
    
    @implementation CustomTableViewCell
    
    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            // Initialization code
            _titleLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, WScreen, 50)];
            [self.contentView addSubview:_titleLabel];
            _titleLabel.backgroundColor=[UIColor whiteColor];
            _titleLabel.font=[UIFont systemFontOfSize:14];
           
        }
        return self;
    }
    

    3) controller - TableViewController和MVC的Controller基本一样,会变精简.

    因为

    • UIViewcontroller的部分逻辑挪动到ViewModel和protocal 中了
    • 我可以简单认为:MVC中Controller == MVVM中的Controller+ViewModel+Protocol
    @implementation TableViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        if (iOS7) {
            self.edgesForExtendedLayout = UIRectEdgeBottom |    UIRectEdgeLeft | UIRectEdgeRight;
        }
        self.title=@"MVVMDemo With TableView";
        self.view.backgroundColor=[UIColor whiteColor];
    
        //创建tableView
        tableView=[[UITableView alloc] initWithFrame:CGRectMake(0, 0, WScreen, HScreen-64) style:UITableViewStylePlain];
        [self.view addSubview:tableView];
    
      //设置数据源代理
        tableViewDataSource=[[TableViewDataSource alloc] init];
        tableViewDelegate=[[TableViewDelegate alloc] init];
        tableView.dataSource=tableViewDataSource;
        tableView.delegate=tableViewDelegate;
        tableViewModel=[[TableViewModel alloc] init];
        totalSource=0;
        
       //    YiRefreshHeader  头部刷新按钮的使用
        refreshHeader=[[YiRefreshHeader alloc] init];
        refreshHeader.scrollView=tableView;
        [refreshHeader header];
        __weak typeof(self) weakSelf = self;
        refreshHeader.beginRefreshingBlock=^(){
            __strong typeof(self) strongSelf = weakSelf;
            [strongSelf headerRefreshAction];
        };
        
       //    是否在进入该界面的时候就开始进入刷新状态
        [refreshHeader beginRefreshing];
    
        //    YiRefreshFooter  底部刷新按钮的使用
        refreshFooter=[[YiRefreshFooter alloc] init];
        refreshFooter.scrollView=tableView;
        [refreshFooter footer];
        refreshFooter.beginRefreshingBlock=^(){
            __strong typeof(self) strongSelf = weakSelf;
            [strongSelf footerRefreshAction];
        };
    }
    
    
    

    4) ViewModel 实现加载数据请求和刷新.(MVVM独有的)

    - (void)headerRefreshAction
    {
       
        [tableViewModel headerRefreshRequestWithCallback:^(NSArray *array){
            totalSource=(NSMutableArray *)array;
            tableViewDataSource.array=totalSource;
            tableViewDelegate.array=totalSource;
            [refreshHeader endRefreshing];
            [tableView reloadData];
        }];
    
    }
    
    - (void)footerRefreshAction
    {
        [tableViewModel footerRefreshRequestWithCallback:^(NSArray *array){
            [totalSource addObjectsFromArray:array] ;
            tableViewDataSource.array=totalSource;
            tableViewDelegate.array=totalSource;
            [refreshFooter endRefreshing];
            [tableView reloadData];
        
        }];
      
    }
    @end
    
    - (void)headerRefreshRequestWithCallback:(callback)callback
    {
            //  后台执行:
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                sleep(2);
                dispatch_async(dispatch_get_main_queue(), ^{
                    //               主线程刷新视图
                    NSMutableArray *arr=[NSMutableArray array];
                    for (int i=0; i<16; i++) {
                        int x = arc4random() % 100;
                        NSString *string=[NSString stringWithFormat:@"    (random%d) 君子性非异也,善假于物也!",x];
                        CustomModel *model=[[CustomModel alloc] init];
                        model.title=string;
                        [arr addObject:model];
                    }
                    callback(arr);
                });
            });
    }
    
    - (void )footerRefreshRequestWithCallback:(callback)callback
    {
            //  后台执行:
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                sleep(2);
                dispatch_async(dispatch_get_main_queue(), ^{
                    //               主线程刷新视图
                    NSMutableArray *arr=[NSMutableArray array];
                    for (int i=0; i<16; i++) {
                        int x = arc4random() % 100;
                        NSString *string=[NSString stringWithFormat:@"    (random%d) 君子性非异也,善假于物也!",x];
                        CustomModel *model=[[CustomModel alloc] init];
                        model.title=string;
                        [arr addObject:model];
                    }
                    callback(arr);
                });
            });
    }
    
    

    5) TableViewProtocol (MVVM独有的)

    ** TableViewDataSource和MVC 的协议一样只是抽取出来而已**

    #import "TableViewDataSource.h"
    #import "CustomTableViewCell.h"
    
    @implementation TableViewDataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return _array.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        if (cell == nil) {
            cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
        }
        cell.titleLabel.text=((CustomModel *)[_array objectAtIndex:indexPath.row]).title;
        return cell;
    }
    
    @end
    

    ** TableViewDelegate代理,和MVC一样只是把他抽取出来而已**

    #import "TableViewDelegate.h"
    
    @implementation TableViewDelegate
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (_array.count>0) {
            UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"" message:((CustomModel *)[_array objectAtIndex:indexPath.row]).title delegate:nil cancelButtonTitle:@"sure" otherButtonTitles:nil, nil];
            [alert show];
        }    
    }
    @end
    
    • 作者其他文章推荐,持续更新学习心得笔记

    Runtime 10种用法(没有比这更全的了)

    成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)

    iOS逆向Reveal查看任意app 的界面

    JSPatch (实时修复App Store bug)学习(一)

    iOS 高级工程师是怎么进阶的(补充版20+点)

    扩大按钮(UIButton)点击范围(随意方向扩展哦)

    最简单的免证书真机调试(原创)

    通过分析微信app,学学如何使用@2x,@3x图片

    TableView之MVVM与MVC之对比

    使用MVVM减少控制器代码实战(减少56%)

    相关文章

      网友评论

      • Xwoder:完整的源码有么
      • 奋斗的蝼蚁:你这个VM 和 View 之间的双向绑定呢,你是怎么考虑的,怎么实现的。
      • ylyadai:源码在github上见过

      本文标题:TableView之MVVM与MVC之对比

      本文链接:https://www.haomeiwen.com/subject/tchljttx.html