IOS-MVC层读取服务器接口JSON数据

此篇文章主要讲述获取服务器JSON接口数据,以便大家在今后的物联网信息时代,移动数据肯定都是需要网络数据的,那么就需要用一个分布集中,整体化的,规范性的创建所需的文件,同时方便以后维护;

分别为:M(model),M(manager),V(view),C(cell),C(controller);

具体程序如下:

一:YSMasonryManager.h

#import <Foundation/Foundation.h>
#import "BaseManager.h"
#import "YSMasonryModel.h"


@protocol YSMasonryManagerDelegate <NSObject>

-(void)networkSuccess:(YSMasonryModel *_Nullable)result;

-(void)networkFail:(NSString *_Nullable)result;

@end

NS_ASSUME_NONNULL_BEGIN

@interface YSMasonryManager : BaseManager

@property(weak,nonatomic) id<YSMasonryManagerDelegate> delegate;

-(void)getDeviceProile:(NSString *)limit Offset:(NSString *)offset;

@end

NS_ASSUME_NONNULL_END

二:YSMasonryManager.m

#import "YSMasonryManager.h"

@implementation YSMasonryManager

-(void)getDeviceProile:(NSString *)limit Offset:(NSString *)offset{
    
    NSString *strUrl = [NSString stringWithFormat:@"%@api/internal/profile",DEVICE_BASE_URL];
    
    //JSON 
    [PPNetworkHelper setRequestSerializer:PPRequestSerializerHTTP];
    [PPNetworkHelper setResponseSerializer:PPResponseSerializerJSON];
    //配置Jwt文件
    [PPNetworkHelper setValue:USERJWTKEYS forHTTPHeaderField:@"Grpc-Metadata-Authorization"];
    
    [PPNetworkHelper GET:strUrl parameters:@"" success:^(id responseObject){
        YSMasonryModel *net = [YSMasonryModel mj_objectWithKeyValues:responseObject];
        if(net.organizations.count>0){
            if([self.delegate respondsToSelector:@selector(networkSuccess:)]){
                [self.delegate networkSuccess:net];
            }
        }else{
            if([self.delegate respondsToSelector:@selector(networkFail:)]){
                [self.delegate networkFail:@"Get Fail!"];
            }
        }
        
    } failure:^(NSError *error){
       // NSError *newError = [NSError returnErrorWithError:error];
        if([self.delegate respondsToSelector:@selector(networkFail:)]){
            [self.delegate networkFail:@"cc"];
        }
    }];
}

@end

分析:

#import "BaseManager.h"//头部manager对象
#import "YSMasonryModel.h"//模型层

三:YSMasonryModel.h

#import <Foundation/Foundation.h>
#import "BaseModel.h"
#import "YSMasonryPileModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface YSMasonryModel : BaseModel

@property(nonatomic, copy) NSString *settings;

@property(nonatomic, copy) NSArray *organizations;

@property(nonatomic, copy) NSString *user;



+(NSDictionary*)mj_objectClassInArray;

@end

NS_ASSUME_NONNULL_END

四:YSMasonryModel.m

#import "YSMasonryModel.h"

@implementation YSMasonryModel

+(NSDictionary*)mj_objectClassInArray{
    return @{@"organizations":[YSMasonryPileModel class],};
}

@end

五:YSMasonryPileModel.h

#import <Foundation/Foundation.h>
#import "BaseModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface YSMasonryPileModel : BaseModel

@property(nonatomic,assign) NSString *isAdmin;

@property(nonatomic, copy) NSString *organizationID;

@property(nonatomic, copy) NSString *organizationName;

@property(nonatomic, copy) NSString *createdAt;

@property(nonatomic, copy) NSString *updatedAt;

@property(nonatomic,assign) NSString *disableAssignExistingUsers;

@property(nonatomic, copy) NSString *email;

@property(nonatomic, copy) NSString *uid;

@property(nonatomic,assign) NSString *isActive;

@property(nonatomic, copy) NSString *note;

@property(nonatomic,assign) NSString *sessionTTL;

@property(nonatomic, copy) NSString *username;

-(id)initWithDict:(NSDictionary*)dict;

@end

NS_ASSUME_NONNULL_END

六:YSMasonryPileModel.m

#import "YSMasonryPileModel.h"

@implementation YSMasonryPileModel


+ (NSDictionary *)mj_replacedKeyFromPropertyName
{
    return @{@"uid": @"uid"};
}

-(id)initWithDict:(NSDictionary*)dict{
    if(self = [super init]){
        self.createdAt = dict[@"createdAt"];
        //@"gatewayDiscoveryEnabled":@(enable),
        self.isAdmin = dict[@"isAdmin"];
        self.organizationID = dict[@"organizationID"];
        self.organizationName = dict[@"networkServerID"];
        self.updatedAt = dict[@"updatedAt"];
        
         self.disableAssignExistingUsers = dict[@"disableAssignExistingUsers"];
        
        self.email = dict[@"email"];
        self.uid = dict[@"id"];
        self.isActive = dict[@"isActive"];
        self.note = dict[@"note"];
        self.sessionTTL = dict[@"sessionTTL"];
        self.username = dict[@"username"];
    }
    return self;
}

@end

七:YSMasonryView.h

#import <UIKit/UIKit.h>
#import "BaseView.h"

NS_ASSUME_NONNULL_BEGIN

@interface YSMasonryView : BaseView

@property(nonatomic,strong) UITableView *mDevericePile;

@end

NS_ASSUME_NONNULL_END

八:YSMasonryView.m

#import <Foundation/Foundation.h>
#import "YSMasonryView.h"
#ifdef __OBJC__
//define this constant if you want to use Masonry without the 'mas_' prefix
#define MAS_SHORTHAND
//define this constant if you want to enable auto-boxing for default syntax
#define MAS_SHORTHAND_GLOBALS
#import "Masonry.h"
#endif

@implementation YSMasonryView

-(void)initView{
    
    _mDevericePile = [[UITableView alloc] init];
    _mDevericePile.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    [self addSubview:_mDevericePile];
    
    [_mDevericePile makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self).offset(0);
        make.left.equalTo(self).offset(0);
        make.right.equalTo(self).offset(0);
        make.bottom.equalTo(self).offset(0);
    }];
}

@end

九:YSMasonryCell.h

#import <UIKit/UIKit.h>
#import "BaseCell.h"

NS_ASSUME_NONNULL_BEGIN

@interface YSMasonryCell : BaseCell

@property(nonatomic, strong) UIImageView *mNetImgVw;

@property(nonatomic, strong) UILabel *mNetNameLb;

@property(nonatomic, strong) UILabel *mNetServerLb;

@property(nonatomic, strong) UILabel *mNetTimeLb;

@end

NS_ASSUME_NONNULL_END

十:YSMasonryCell.m

#import "YSMasonryCell.h"

@implementation YSMasonryCell

- (void)awakeFromNib {
    [super awakeFromNib];
}


- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if(self){
        UIView *mainView = [[UIView alloc] init];
        mainView.layer.cornerRadius = 8;
        mainView.layer.borderColor = [[UIColor grayColor] CGColor];
        mainView.layer.borderWidth = 1;
        [self addSubview:mainView];
        
        [mainView makeConstraints:^(MASConstraintMaker *make){
            make.left.equalTo(self).offset(10);
            make.right.equalTo(self).offset(-10);
            make.top.equalTo(self).offset(10);
            make.bottom.equalTo(self).offset(-10);
        }];
        
        _mNetImgVw = [[UIImageView alloc] init];
        [mainView addSubview:_mNetImgVw];
        
        [_mNetImgVw makeConstraints:^(MASConstraintMaker *make){
            make.centerY.equalTo(self);
            make.left.equalTo(self).offset(20);
            make.width.equalTo(@25);
            make.height.equalTo(@25);
        }];
        
        //Net名称
        _mNetNameLb = [[UILabel alloc] init];
        _mNetNameLb.textColor = [UIColor grayColor];
        _mNetNameLb.font = [UIFont fontWithName:@"Helvetica-Bold" size:16];
        _mNetNameLb.textAlignment = NSTextAlignmentLeft;
        [mainView addSubview:_mNetNameLb];
        
        [_mNetNameLb makeConstraints:^(MASConstraintMaker *make){
            make.top.equalTo(mainView).offset(5);
            make.left.equalTo(self.mNetImgVw).offset(35);
            make.right.equalTo(mainView).offset(-5);
            make.height.equalTo(@30);
        }];
        
        //创建时间
        _mNetTimeLb = [[UILabel alloc] init];
        _mNetTimeLb.textColor = [UIColor grayColor];
        _mNetTimeLb.font = [UIFont fontWithName:@"Helvetica-Bold" size:14];
        _mNetTimeLb.textAlignment = NSTextAlignmentRight;
        [mainView addSubview:_mNetTimeLb];
        
        [_mNetTimeLb makeConstraints:^(MASConstraintMaker *make){
            make.top.equalTo(mainView).offset(10);
            make.right.equalTo(mainView).offset(-10);
            make.width.equalTo(@160);
            make.height.equalTo(@30);
        }];
        
        //端口号
        _mNetServerLb = [[UILabel alloc] init];
        _mNetServerLb.textColor = [UIColor grayColor];
        _mNetServerLb.font = [UIFont fontWithName:@"Helvetica-Bold" size:16];
        _mNetServerLb.textAlignment = NSTextAlignmentLeft;
        [mainView addSubview:_mNetServerLb];
        
        [_mNetServerLb makeConstraints:^(MASConstraintMaker *make){
            make.bottom.equalTo(self).offset(-15);
            make.left.equalTo(self.mNetImgVw).offset(35);
            make.right.equalTo(mainView).offset(-10);
            make.height.equalTo(@30);
        }];
    }
    return self;
}


- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
}

@end

十一:YSMasonryContller.h

#import <UIKit/UIKit.h>
#import "BaseViewController.h"
#import "YSMasonryView.h"
#import "YSMasonryCell.h"
#import "YSMasonryManager.h"
#import "YSMasonryPileModel.h"
#import "MBProgressHUD.h"
#import "MJRefresh.h"
#import "WHToast.h"


NS_ASSUME_NONNULL_BEGIN

@interface YSMasonryContller : BaseViewController

@property(nonatomic,strong) YSMasonryView *lgdView;

@property(nonatomic, strong) YSMasonryManager *lgdManager;

@property(strong, nonatomic) NSMutableArray *dataList;

@property (strong,nonatomic) MBProgressHUD *hud;

@property(nonatomic, strong) YSMasonryPileModel *model;

@property(nonatomic, strong) NSString *organizations;

@property(assign,nonatomic) int limit;

@property(assign,nonatomic) int offsert;

@end

NS_ASSUME_NONNULL_END

十二:YSMasonryContller.m

#import <Foundation/Foundation.h>
#import "YSMasonryContller.h"

#define CELLIDENTIFITER "NETTABLEVIEWCELL"

@interface YSMasonryContller()<YSMasonryManagerDelegate,UITableViewDataSource, UITableViewDelegate,UITextFieldDelegate>

@end

@implementation YSMasonryContller

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initData];
    
}

//头部标题a
- (void)customContentView{
    UIColor *commonBlue = [self.commonUtil stringToColor:@"#333333"];
    [self.navigationController.navigationBar setBarTintColor:commonBlue];
    self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
    self.navigationItem.title = @"NetWork Server";
}

- (void)customNavigationLeftItem{
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = item;
}


-(void)customNavigationRightItem{
    UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithTitle:@"Add" style:UIBarButtonItemStylePlain target:self action:@selector(onAddClick)];
    add.tintColor = [UIColor whiteColor];
    self.navigationItem.rightBarButtonItem = add;
}



-(void)initData{
    UIView *view = [[UIView alloc] init];
    self.lgdView.mDevericePile.tableFooterView = view;
    
    self.lgdView.frame = self.view.bounds;
    [self.view addSubview:self.lgdView];
    
    _limit = 5;
    _offsert = 0;
    
}
//启动时的运行数据
- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    //加载数据
    NSString *slimit = [NSString stringWithFormat:@"%d",_limit];
    NSString *soffset = [NSString stringWithFormat:@"%d",_offsert];
    [self.lgdManager getDeviceProile:slimit Offset:soffset];
}

-(YSMasonryView*)lgdView{
    if(_lgdView==nil){
        _lgdView = [[YSMasonryView alloc] init];
        _lgdView.mDevericePile.dataSource = (id)self;
        _lgdView.mDevericePile.delegate = (id)self;
    }
    return _lgdView;
}

-(YSMasonryManager*)lgdManager{
    if(_lgdManager==nil){
        _lgdManager = [[YSMasonryManager alloc] init];
        _lgdManager.delegate = (id)self;
    }
    return _lgdManager;
}

-(NSMutableArray*)dataList{
    if(_dataList==nil){
        _dataList = [NSMutableArray array];
    }
    return _dataList;
}

#pragma mark get network data

-(void)networkSuccess:(YSMasonryModel *_Nullable)result{
    [self.lgdView.mDevericePile.mj_header endRefreshing];
    [self.lgdView.mDevericePile.mj_footer endRefreshing];
    self.dataList = [NSMutableArray arrayWithArray:result.organizations];
    [self.lgdView.mDevericePile reloadData];

}


-(void)networkFail:(NSString *_Nullable)result{
    [self.lgdView.mDevericePile.mj_header endRefreshing];
    [self.lgdView.mDevericePile.mj_footer endRefreshing];
    [WHToast showMessage:result originY:500 duration:2 finishHandler:^{
    }];
}


#pragma mark tableView

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataList.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    YSMasonryCell *cell = [tableView dequeueReusableCellWithIdentifier:@CELLIDENTIFITER];
    
    if(cell==nil){
        cell = [[YSMasonryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@CELLIDENTIFITER];
    }
    
    if(_dataList.count>0){
        YSMasonryPileModel *model = [[YSMasonryPileModel alloc] initWithDict:[self.dataList objectAtIndex:indexPath.row]];
        if(model!=nil){
            //cell.mNetImgVw.image = [UIImage imageNamed:@"net"];
           // cell.mNetNameLb.text = model.isAdmin;
           // cell.mNetTimeLb.text = [self dateAndStrings:model.createdAt];
            cell.mNetServerLb.text = @"vv";
        }
    }
    return cell;
}



-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(_dataList.count>0){
        YSMasonryPileModel *model = [[YSMasonryPileModel alloc] initWithDict:[self.dataList objectAtIndex:indexPath.row]];
        
        if(model!=nil){
           // [self updateNetWorkServer:model.deviceprolieid];
        }
    }
}


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100;
}

-(NSString*)dateAndStrings:(NSString*)date{
    if(date!=nil){
        NSArray *strtime = [date componentsSeparatedByString:@"T"];
        //NSString *strtime = [date stringByReplacingOccurrencesOfString:@"T" withString:@" "];
        return strtime[0];
    }
    return @"None";
}

//添加add设备
-(void)onAddClick{

}
@end

十三:所用到的常量一些定义:
Constants.h

#import <Foundation/Foundation.h>

#define BASE_URL @"http://110.22.33/ilLoRaWan/"

#define USERJWTKEYS @"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJsb3JhLWFwcC1zZXJ2ZXIiLCJhdWQiOiJsb3JhLWFwc"

至此!
以上详细的代码,主要就是mode数据层那,修改自己的json的返回数据,与一些字典类型的转换,就没其他的难点了。这样写的主要目的是,思路逻辑更清晰,后期维护也简单,分开着写代码更简洁。…

若有什么疑问的可以留言,大家相互学习努力,希望帮助更多的看官,少走些弯路,谢谢您的阅读,后期继续加油!!~

发布了63 篇原创文章 · 获赞 38 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_37523448/article/details/101206799