IOS-MVC 계층 읽 기 서버 인터페이스 JSON 데이터
각각 M(model),M(manager),V(view),C(cell),C(controller)이다.
구체 적 인 절 차 는 다음 과 같다.
1: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
2: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"//
3.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
4:YSmasonryModel.m
#import "YSMasonryModel.h"
@implementation YSMasonryModel
+(NSDictionary*)mj_objectClassInArray{
return @{@"organizations":[YSMasonryPileModel class],};
}
@end
5: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
6: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
7: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
8: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
9: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
10: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
11: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
12: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
13:사용 하 는 상수 의 정의:Constants.h
#import <Foundation/Foundation.h>
#define BASE_URL @"http://110.22.33/ilLoRaWan/"
#define USERJWTKEYS @"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJsb3JhLWFwcC1zZXJ2ZXIiLCJhdWQiOiJsb3JhLWFwc"
여기까지!이상 의 상세 한 코드 는 주로 mode 데이터 층 입 니 다.자신의 json 의 반환 데 이 터 를 수정 하고 일부 사전 유형 과 의 전환 은 다른 난점 이 없습니다.이렇게 쓰 는 주요 목적 은 사고방식 의 논리 가 더욱 뚜렷 하고 후기 유지보수 도 간단 하 며 분리 해서 쓰 는 코드 가 더욱 간결 하 다 는 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IOS에서 ReplayKit 및 RTC 사용 방법응용된 소리와 아나운서의 소리를 포함한다.이 두 가지 수요를 감안하여 우리는 스크린 공유를 하는 생방송에 필요한 미디어 흐름을 간단하게 분석할 수 있다. 만약 우리가 Audio App과 Audio Mic를 두 개의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.