JSONModel第三方库的使用与manager封装网络请求

JSONModel第三方库的功能是什么

JSONModel是json转model的第三方开源库。当我们向服务器发送一个请求之后,通过JSONModel把数据转成model中的属性就可以很方便的供给我们使用了。

JSONModel第三方库的使用

使用第三方库首先需要配置Cocoapods环境和安装JSONModel第三方库
配置Cocoapods环境和安装第三方库的方法见此博客:详见博客(注:由于安装第三方库的方法都相同,故可按照博客中Masonry第三方库的安装流程进行安装)
JSONModel第三方库安装完成后,在需要用到该第三方库的文件中引用#import "JSONModel.h"头文件即可使用第三方库的功能
下面,我们就用知乎API来进行JSONModel第三方库的实际使用:
首先,我们创建一个TestModel类,其继承于JSONModel类
在TestModel.h文件中:(此处我们网络请求回来的数据是一个嵌套的数组)

@protocol StoriesModel
@end

@protocol Top_StoriesModel
@end

#import <JSONModel/JSONModel.h>
#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface TestModel : JSONModel

@property (nonatomic, copy) NSString *date;
//这两行代码很关键,是将下面两个类转化为数组
@property (nonatomic, copy) NSArray<StoriesModel> *stories;
@property (nonatomic, copy) NSArray<Top_StoriesModel> *top_stories;

@end

@interface StoriesModel : JSONModel
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *image_hue;
@property (nonatomic, copy) NSString *id;

@end

@interface Top_StoriesModel : JSONModel
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *ga_prefix;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *image_hue;
@property (nonatomic, copy) NSString *id;

@end

NS_ASSUME_NONNULL_END

在TestModel.h中,代码如下:

//每个类中添加+(BOOL)propertyIsOptional:(NSString *)propertyName
//+(BOOL)propertyIsOptional:(NSString *)propertyName 作用是不想因为服务器的某个值没有返回(nil)就使程序崩溃, 我们会加关键字Optional
#import "TestModel.h"

@implementation TestModel
+ (BOOL) propertyIsOptional:(NSString *)propertyName {
    return YES;
}
@end

@implementation StoriesModel
+ (BOOL) propertyIsOptional:(NSString *)propertyName {
    return YES;
}
@end

@implementation Top_StoriesModel
+ (BOOL) propertyIsOptional:(NSString *)propertyName {
    return YES;
}
@end

在ViewController.m中:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSString *json = @"https://news-at.zhihu.com/api/4/news/latest";
    json = [json stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    NSURL *testUrl = [NSURL URLWithString:json];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testUrl];
    NSURLSession *testSession = [NSURLSession sharedSession];
    NSURLSessionDataTask *testDataTask = [testSession dataTaskWithRequest:testRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        TestModel *allData = [[TestModel alloc] initWithData:data error:nil];
        NSLog(@"%@", allData.stories[0]);
    }];
    //任务启动
    [testDataTask resume];
}

运行结果:
请添加图片描述
网络请求后的数据JSON翻译后如下:
请添加图片描述
从运行结果可以看出,我们打印的是allData.stories[0],打印结果与json翻译后的结果一致。

Manager封装一个网络请求

首先我们创建一个manager类,其继承于NSObject类,manager类的创建使用单例模式

  • 在iOS开发过程中需要使用到一些全局变量以及管理方法,可以将这些变量以及方法封装在一个管理类中,这符合MVC开发模式,这就要用到单例模式。
  • 将需要用到的全局变量和解析方法存到一个类中。一个类中只有一个实例,减少了频繁的创建与销毁。节省资源。
  • 单例模式的变量在整个程序中只需要创建一次,考虑到它的生命周期,唯一性以及线程安全,我们这样来创建
  • static修饰全局变量,作用域仅限于当前文件,外部类是不可以访问到该全局变量的。 默认情况下,全局变量在整个程序中是可以被访问的
  • dispatch_once_t的使用保证了线程安全

manager.h文件中代码如下:(其中block的定义为关键)

#import <Foundation/Foundation.h>
#import "TestModel.h"
//块定义,定义一个block类型的变量SucceeBlock 为输入参数 其需要参数类型是id 返回值是第二个括号的块
//这样可以利用SucceeBlock进行参数的传递或者编辑
typedef void (^succeedBlockTest)(TestModel *_Nonnull mainViewNowModel);
//失败返回error
typedef void (^ErrorBlock)(NSError *_Nonnull error);

NS_ASSUME_NONNULL_BEGIN

@interface manager : NSObject

+ (instancetype) sharedManger;

- (void) NetWorkTestWithData:(succeedBlockTest) succeedBlock error:(ErrorBlock) errorBlock;

@end

NS_ASSUME_NONNULL_END

manager.m文件中的代码如下:

#import "manager.h"

static manager *managerTest = nil;
@implementation manager

//创建或直接返回已经创建好的单例
+ (instancetype) sharedManger {
    if (!managerTest) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            managerTest = [manager new];
        });
    }
    return managerTest;
}

//网络请求
- (void) NetWorkTestWithData:(succeedBlockTest)succeedBlock error:(ErrorBlock)errorBlock {
    NSString *json = @"https://news-at.zhihu.com/api/4/news/latest";
    json = [json stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    NSURL *testUrl = [NSURL URLWithString:json];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testUrl];
    NSURLSession *testSession = [NSURLSession sharedSession];
    NSURLSessionDataTask *testDataTask = [testSession dataTaskWithRequest:testRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {
            TestModel *allData = [[TestModel alloc] initWithData:data error:nil];
            succeedBlock(allData);
        } else {
            errorBlock(error);
        }
    }];
    //启动任务
    [testDataTask resume];
}

@end

另外还需创建TestModel类,其.h和.m.文件和上方JSONModel第三方库中的代码一致,此处就不赘述了

ViewController.h文件中代码如下:(只需引用头文件)

#import <UIKit/UIKit.h>
#import "TestModel.h"
#import "manager.h"

@interface ViewController : UIViewController


@end

ViewController.m文件中代码如下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    [self test];
    
}

- (void) test {
    
    //根据网络请求的结果执行不同代码
    [[manager sharedManger] NetWorkTestWithData:^(TestModel * _Nonnull mainViewNowModel) {
        NSLog(@"%@", mainViewNowModel.stories[1]);
    } error:^(NSError * _Nonnull error) {
        NSLog(@"请求失败");
    }];
    
}

@end

此处我们打印的结果为mainViewNowModel.stories[1],运行结果如下:
请添加图片描述
与下图json翻译结果对比发现打印结果与翻译结果一致
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值