• MVP-架构分析


    MVC跟MVP的区别以及使用的优缺点
    MVC:View和控制器耦合性强
    MVP:面向协议,View和Model完全解耦,获取数据(网络遵循协议拿数据,Controller层不显示网络请求数据的过程,只要遵循协议就能拿到数据)

    UserPresenter层

    #import <Foundation/Foundation.h>
    #import "User.h"
    @interface UserViewData : NSObject
    /** 名字 */
    @property (nonatomic, strong) NSString * name ;
    /** 年龄 */
    @property (nonatomic, strong) NSString * age ;
    - (instancetype)initWithName:(NSString*)name age:(NSString*)age;
    @end
    
    
    NS_ASSUME_NONNULL_BEGIN
    @protocol UserViewDelegate <NSObject>
    
    - (void)startLoading;
    - (void)finishLoading;
    
    //用户界面的数据
    - (void)setUsers:(NSArray<UserViewData *> *)userViewData;
    //数据是空的时候显示
    - (void)setEmptyUsers;
    @end
    
    @interface UserPresenter : NSObject
    @property (nonatomic, weak) id<UserViewDelegate> delegate ;
    - (void)getUsers;
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "UserPresenter.h"
    
    @implementation UserViewData
    - (instancetype)initWithName:(NSString*)name age:(NSString*)age
    {
        self = [super init];
        if (self) {
            self.name = name;
            self.age = age;
        }
        return self;
    }
    @end
    
    @implementation UserPresenter
    -(void)getUsers {
        __weak typeof(self) weakSelf = self;
        [User getUsers:^(NSArray<User *> * _Nonnull users) {
            [weakSelf.delegate finishLoading];
            BOOL hasUser = users && users.count;
            if (!hasUser) {
                [weakSelf.delegate setEmptyUsers];
            }else {
                NSMutableArray<UserViewData *> *userViewDatas = [NSMutableArray arrayWithCapacity:11];
                for (User * user in users) {
                    NSString * ageStr = [NSString stringWithFormat:@"年龄%zd",user.age];
                    UserViewData * userViewData = [[UserViewData alloc] initWithName:user.firstName age:ageStr];
                    [userViewDatas addObject:userViewData];
                }
                if ([self.delegate respondsToSelector:@selector(setUsers:)]) {
                    [self.delegate setUsers:userViewDatas];
                }
            }
        }];
    }
    @end

    使用:

    #import "ViewController.h"
    #import "User.h"
    #import "UserPresenter.h"
    @interface ViewController ()<UITableViewDataSource,UserViewDelegate>
    /** TableView */
    @property (nonatomic, strong) UITableView * tableView ;
    /** 指示器 */
    @property (nonatomic, strong) UIActivityIndicatorView * indicator ;
    /** 空白占位 */
    @property (nonatomic, strong) UIView * emptyView ;
    /** Protocol */
    @property (nonatomic, strong) UserPresenter * userPresenter ;
    /** 数据源 */
    @property (nonatomic, strong) NSArray<UserViewData*> * userViewDatas ;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        [self setupUI];
        [self loadData];
    }
    
    - (void)setupUI {
        
        _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        [self.view addSubview:_tableView];
        _tableView.dataSource = self;
    }
    
    - (void)loadData {
        self.userPresenter = [[UserPresenter alloc] init];
        self.userPresenter.delegate = self;
        [self.userPresenter getUsers];
    }
    
    #pragma mark - UserViewDelegate
    
    -(void)startLoading {
        self.indicator.hidden = NO;
        [self.indicator startAnimating];
    }
    
    - (void)finishLoading {
        [self.indicator stopAnimating];
        self.indicator.hidden = YES;
    }
    
    //用户界面的数据
    -(void)setUsers:(NSArray<UserViewData *> *)userViewData {
        self.userViewDatas = userViewData;
        self.tableView.hidden = NO;
        self.emptyView.hidden = YES;
        [self.tableView reloadData];
    }
    
    //数据是空的时候显示
    -(void)setEmptyUsers {
        self.emptyView.hidden = NO;
        self.tableView.hidden = YES;
        self.indicator.hidden = YES;
    }
    #pragma mark - 数据源方法
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.userViewDatas.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString * cellID=@"cellID";
        UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:cellID];
        if (cell==nil) {
            cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellID];
        }
        UserViewData *userViewData = self.userViewDatas[indexPath.row];
        cell.textLabel.text = userViewData.name;
        cell.detailTextLabel.text = userViewData.age;
        return cell;
    }
    @end
  • 相关阅读:
    获取路径API:GetCurrentDirectory、GetModuleFileName
    任务栏显示程序详解
    MSXML读取XML文件
    解决VS断点无效问题
    非console程序显示DOS窗口
    Windows系统版本宏_WIN32_WINNT对应值
    sql2005 reporting service,我总算找到一个完全程序化绑定报表(ado.net dataset 绑定reprot)的方案,谁能再给我些其他建议呢? Carlwave
    在ASP.net中保存/取出图片入/从SQL数据库(可用于上传图片) Carlwave
    谁能谈谈国外软件行业的实际情况么?(全美“50大好差事” 软件工程师排名第一) Carlwave
    转:微软今年必做三大事(from csdn.net) Carlwave
  • 原文地址:https://www.cnblogs.com/StevenHuSir/p/10328989.html
Copyright © 2020-2023  润新知