美文网首页
iOS 之MVP设计模式(OC)

iOS 之MVP设计模式(OC)

作者: MichaelDing | 来源:发表于2019-08-23 16:29 被阅读0次

    闲来无事,研究了下IOS的MVP设计架构,分享下自己的感悟,说的不对的地方还请各位大神不吝指教
    首先上一张图:


    3096256-6c10a494d89a58d6.jpg

    1 . 概念:"MVP"中的M指的是model,"V"指的是UIViewController以及UIView,"P"指的是"Present",
    MVP解耦的关键在于将传统的UIViewController部分业务逻辑交由"Present"处理,比如网络请求,用户的操作行为,

    1. "MPV"如何解耦以及与他们三者之间是如何通信的呢?
      "Present"一方面通过Service层调用接口获取数据给Model层,
     [_userService getUserInfosSuccess:^(NSDictionary *dic) {
            [self.attachView hideIndicator];
            NSArray *userArr = [dic valueForKey:@"data"];
            
            if ([self processOriginDataToUIFriendlyData:userArr].count == 0) {
                [self.attachView showEmptyView];
            }
            [self.attachView userViewDataSource:[self processOriginDataToUIFriendlyData:userArr]];
        } andFail:^(NSDictionary *dic) {
            
        }];
    - (NSArray<UserModel *> *)processOriginDataToUIFriendlyData:(NSArray *)originData {
        NSMutableArray<UserModel *> *friendlyUIData = [NSMutableArray array];
        for (NSDictionary *dic in originData) {
            if ([[dic valueForKey:@"gender"] isEqualToString:@"male"]) {
                UserModel *model = [UserModel userWithDict:dic];
                [friendlyUIData addObject:model];
            }
        }
        return friendlyUIData;
    }
    

    然后又以协议的方式

     [self.attachView userViewDataSource:[self processOriginDataToUIFriendlyData:userArr]];
    

    将数据传给UIViewController

    #pragma mark - UserViewProtocol
    - (void)userViewDataSource:(NSArray<UserModel *> *)data {
        self.friendlyUIData = data;
        [self.tableView reloadData];
    }
    

    从而实现"Present"层向"V"层通信的机制,同时"V"层的控制器UIViewController通过添加"Present"对象

    - (Presenter *)presenter {
        if (_presenter == nil) {
            _presenter = [[Presenter alloc] init];
            [_presenter attachView:self];
        }
        return _presenter;
    }
    
    

    实现"V"层向"Present"层通信,因此我们可以看出"V"层和"Present"是双向通信,而"P"即"Present"则通过请求数据赋值给Model来实现"P"层和"M"层通信,

    1. 用户的一些业务逻辑和操作全部交由"Present"去操作,而Present又是通过协议的方式
    @interface Presenter()
    
    @property (nonatomic,strong) UserService *userService;
    
    @property (nonatomic, weak) id<UserViewProtocol> attachView;
    
    @end
    #import "UserModel.h"
    
    @protocol UserViewProtocol <NSObject>
    
    - (void)userViewDataSource:(NSArray<UserModel *> *)data;
    
    - (void)showIndicator;
    
    - (void)hideIndicator;
    
    - (void)showEmptyView;
    
    

    去响应用户的操作,具体的协议操作也是在“V”即Controller层实现

    #pragma mark - UserViewProtocol
    - (void)userViewDataSource:(NSArray<UserModel *> *)data {
        self.friendlyUIData = data;
        [self.tableView reloadData];
    }
    
    - (void)showIndicator {
        [self.indicatorView startAnimating];
        self.indicatorView.hidden = NO;
    }
    
    - (void)hideIndicator {
        [self.indicatorView stopAnimating];
    }
    
    

    相关文章

      网友评论

          本文标题:iOS 之MVP设计模式(OC)

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