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的返回数据,与一些字典类型的转换,就没其他的难点了。这样写的主要目的是,思路逻辑更清晰,后期维护也简单,分开着写代码更简洁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • IOS用AFN发送字符串形式的Json数据给服务器实例

    每个人遇到后台的需求不一样,我只能写出自己目前遇到的需求和做法,我的后台是需要一个Json的key,对应一个字符串类型的字典,后台要求的是带双引号和冒号的字典,所以就拼接了一下 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 发送post请求 // manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.respon

  • Vue中Axios从远程/后台读取数据

    Axios从远程读取数据 学习Axios的知识,并把数据从远端读取到页面上.后端数据,只要调用相应的页面就可以调取,在实际开发中,这些后台数据是需要后端程序员和你共同讨论制作的.我们现在只做前端,数据大家只要会调用即可. 安装Axios 我们直接使用npm install来进行安装. cnpm install axios –save 由于axios是需要打包到生产环境中的,所以我们使用–save来进行安装. 引入Axios(在哪个模块中使用就在哪个模块中引入) 我们在.vue页面引入Axios,

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

    此篇文章主要讲述获取服务器JSON接口数据,以便大家在今后的物联网信息时代,移动数据肯定都是需要网络数据的,那么就需要用一个分布集中,整体化的,规范性的创建所需的文件,同时方便以后维护: 分别为:M(model),M(manager),V(view),C(cell),C(controller); 具体程序如下: 一:YSMasonryManager.h #import <Foundation/Foundation.h> #import "BaseManager.h" #im

  • Python如何读取、写入JSON数据

    问题 你想读写JSON(JavaScript Object Notation)编码格式的数据. 解决方案 json 模块提供了一种很简单的方式来编码和解码JSON数据.其中两个主要的函数是 json.dumps() 和 json.loads() ,要比其他序列化函数库如pickle的接口少得多.下面演示如何将一个Python数据结构转换为JSON: import json data = { 'name' : 'ACME', 'shares' : 100, 'price' : 542.23 } j

  • 基于$.ajax()方法从服务器获取json数据的几种方式总结

    一.什么是json json是一种取代xml的数据结构,和xml相比,它更小巧但描述能力却很强,网络传输数据使用流量更少,速度更快. json就是一串字符串,使用下面的符号标注. {键值对} : json对象 [{},{},{}] :json数组 "" :双引号内是属性或值 : :冒号前为键,后为值(这个值可以是基本数据类型的值,也可以是数组或对象),所以 {"age": 18} 可以理解为是一个包含age为18的json对象,而[{"age":

  • Spring MVC登录注册以及转换json数据

    项目结构; 代码如下: BookController package com.mstf.controller; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.map.ObjectMapper; import com.mstf.

  • go语言中json数据的读取和写出操作

    go自带json库,在使用时需要通过 import "encoding/json"来导入该库. 在读取和写入json数据之前需要定义相关的结构体来对应被操作的json数据的格式,并且结构体中需要导出或导入的变量首字母大写. 其中,json.Marshal()用于将一个对象转换为json格式的字节数组,json.Unmarshal()用于将json格式的字节数组转换为一个对象. 具体使用示例如下所示: 首先,定义结构体: type Com struct { Name string Nod

  • Java字节与字符流永久存储json数据

    使用第三方json转换工具,阿里巴巴json转换工具Fastjson1.2.7. http://www.jb51.net/softs/530842.html 注意:jar包的导入不再赘述,详见百度. User类,定义两种属性,并创建构造方法与get和set方法 public class User { public String userName; //名字 public double balance; //金额 public User() { super(); } public User(Str

  • AJAX跨域请求JSONP获取JSON数据的实例代码

    Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索.使用XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器.Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序. 不过,由于受到浏览器的限制,该方法

  • Android随手笔记44之JSON数据解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析. 1.JSON数据结构 在JSON中有两种数据结构:对象和数组. 1.1对象 在JSON中,一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"

  • SpringMVC接收与响应json数据的几种方式

    前言 前后端的数据交互,除了通过form表单进行提交外,也可以通过ajax向后端传递和接收json格式数据(这种方式可以实现请求数据和页面分离).本文将总结一下在Spring MVC中接收和响应json数据的几种方式. 话不多说了,来一起看看详细的介绍吧 准备步骤: 1.导入json相关框架的依赖(比如jackson). 2.spring mvc的controller方法正常写,如果需要响应json,增加@responsebody注解. 3.在接受json对应的输入参数前,加上@RequestB

  • java读取其他服务接口返回的json数据示例代码

    前言 现在开发大部分都是服务化或者微服务,数据交换都是跨服务的,这里记录java调取其他接口的方法,下面话不多说了,来一起看看详细的介绍吧. java代码如下: /** * *<p>类描述:接口读取工具.</p> */ public class ReadUrlUtil { public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException { InputStream is =

随机推荐