被错误理解和使用的MVC

作者: liyc_dev | 来源:发表于2017-04-27 14:45 被阅读145次

    现在的工作中在使用MVVM(学习中),今天突然意识到之前对MVC理解错了。

    现在的理解

    应用就是与用户操作,处理一系列的数据后再呈现给用户。
    model是处理这些数据用的,比如请求、映射、过滤、排序……
    view是用来显示数据、与用户交互的。
    controller是用来协调V与M的。

    比如,举个例子,下面是部分代码。具体的请移步这里

    Model.h

    #import <Foundation/Foundation.h>
    
    @interface Model : NSObject
    
    @property (nonatomic, strong) NSArray *personArray;
    
    - (void)fetchPersonArray;
    
    @end
    

    Model.m

    #import "Model.h"
    #import "Person.h"
    
    @implementation Model
    
    - (void)fetchPersonArray {
        // 请求网络
        // 或者
        // 访问数据库
    
        Person *person1 = [Person personWithName:@"aaaaa" age:1];
        Person *person2 = [Person personWithName:@"bbbbb" age:2];
        Person *person3 = [Person personWithName:@"ccccc" age:3];
        Person *person4 = [Person personWithName:@"ddddd" age:4];
    
        self.personArray = @[person1, person2, person3, person4];
    }
    
    @end
    

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    
    + (instancetype)personWithName:(NSString *)name age:(NSInteger)age;
    
    @end
    

    ViewController.m

    #import "ViewController.h"
    #import "Model.h"
    #import "Person.h"
    #import "View.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) Model *model;
    @property (nonatomic, strong) View *customView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.model = [[Model alloc] init];
        [self.model addObserver:self forKeyPath:@"personArray" options:NSKeyValueObservingOptionNew context:nil];
    
        self.customView = [[View alloc] init];
        self.customView.frame = self.view.bounds;
        [self.view addSubview:self.customView];
    
        [self.model fetchPersonArray];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
        if ([keyPath isEqualToString:@"personArray"]) {
            [self updateUI];
        }
    }
    
    - (void)updateUI {
        self.customView.personName1.text = [self.model.personArray[0] name];
        self.customView.personName2.text = [self.model.personArray[1] name];
        self.customView.personName3.text = [self.model.personArray[2] name];
        self.customView.personName4.text = [self.model.personArray[3] name];
    }
    
    @end
    

    当然以上的理解还不敢说正确,但是可以肯定的是我之前是错了。
    感觉挺惭愧的,错了这么久,谨记!!!

    之前的理解(错误)

    model是数据模型,比如上面中Person的角色
    view是用来显示数据、与用户交互的。
    controller是用来处理逻辑,协调V与M的。

    将上面的例子用错误的方式实现如下,具体代码请移步这里

    Model.h

    #import <Foundation/Foundation.h>
    
    @interface Model : NSObject
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    
    + (instancetype)personWithName:(NSString *)name age:(NSInteger)age;
    
    @end
    

    ViewController.m

    #import "ViewController.h"
    #import "Model.h"
    #import "View.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) NSArray *personArray;
    @property (nonatomic, strong) View *customView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.customView = [[View alloc] init];
        self.customView.frame = self.view.bounds;
        [self.view addSubview:self.customView];
    
        __weak ViewController *weakSelf = self;
        [self fetchPersonArray:^{
            [weakSelf updateUI];
        }];
    }
    
    - (void)fetchPersonArray:(void (^)(void))completion {
        Model *person1 = [Model personWithName:@"aaaaa" age:1];
        Model *person2 = [Model personWithName:@"bbbbb" age:2];
        Model *person3 = [Model personWithName:@"ccccc" age:3];
        Model *person4 = [Model personWithName:@"ddddd" age:4];
    
        self.personArray = @[person1, person2, person3, person4];
    
        if (completion) {
            completion();
        }
    }
    
    - (void)updateUI {
        self.customView.personName1.text = [self.personArray[0] name];
        self.customView.personName2.text = [self.personArray[1] name];
        self.customView.personName3.text = [self.personArray[2] name];
        self.customView.personName4.text = [self.personArray[3] name];
    }
    
    @end
    

    相关文章

      网友评论

      • GloomySunday:mvc中的model严格定义来说应该只是数据展示层的抽象实体的实现,比如订单model,用户model。文中表示两个其实都没有错。标记错误的严格说履行了model层在mvc中的职责,所以并不能说他是错的。而上面说的对的其实是mvc-store。也即是mvcs。
        mvcs将model区分成了fat model 和thin model。区别是fat model 本身保研一定可复用的数据处理逻辑。来达到为c瘦身和代码复用的目的。
        在mvcs上讲fat model 再次抽象其实可以理解成演变成现在的mvvm。也就是说 mvvm中的view model其实是mvcs 中fat model 的再次拆分结果再加上数据绑定
        liyc_dev:@GloomySunday 嗯嗯,多谢
        GloomySunday:@liyc_dev 不论怎么去划分。秉持一个解耦合和服用就好啦。因为往往最后决定如何做某种程度上取决于具体内容
        liyc_dev:@GloomySunday 哇,好像很有道理,看样子这里的门道还有好多啊,多谢指点,我在好好研究一下
      • Hanfank:还不是很懂
        liyc_dev:@韩哒哒 上面评论说的也很到位。不过我觉得这东西有一天可能突然就明白了
      • 不上火喝纯净水:Model层可以认为是数据业务层 可以提供原始数据的本地或网络的存取,并且包含一些跟数据固有的业务处理,但不涉及界面相关的任何东西,这样的model层便于复用。 当然model层是包含实体层的,并且一般都建议实体层是单独一个子层,它纯粹是用来表达数据的结构可以跟数据库和网络接口对应。 因为MVC中的model层从来就没说是一个类 可以给它再垂直细分
        liyc_dev:@不上火喝纯净水 赞,遇到大神了

      本文标题:被错误理解和使用的MVC

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