iOS——Manage封装一个网络请求

本文介绍了如何在iOS应用中使用单例模式封装网络请求管理类,确保线程安全并方便数据传递。通过`dispatch_once`保证单例的唯一性,同时展示了在Manager类中实现网络请求的方法,包括数据解析和错误处理。在ViewController中调用单例方法进行网络请求,实现了数据的获取和回调。
摘要由CSDN通过智能技术生成

iOS——Manage封装一个网络请求

我们一般去写网络请求的时候,都是将网络请求写在viewDidLoad中,但现实中却不是这么简单的,我们需要有不同的网络请求的时候就可以用单例模式,创建一个全局的Manage类,用实例Manage来执行网络请求方法,顺便用Manage传递请求数据,在model里完成数据解析。单例在整个生命周期中只需要创建一次,Manager同理,再考虑到唯一性及线程安全,在这里我们给Manager的创建加锁,若已经存在Manager便不再申请。

核心代码

我们需要用block进行传值,在对应的Manager.h文件中:

//块定义 定义一个block 类型的变量 SuccesBlock  为输入参数 其需要参数类型是id 返回值是第二个括号 的块
//这样就可以利用 SuccesBlock进行参数的传递或者是编辑。
typedef void (^TestSucceedBlock)(TestModel * _Nonnull mainViewNowModel);
//失败返回error
typedef void (^ErrorBlock)(NSError * _Nonnull error);
@interface Manager : NSObject

+ (instancetype)sharedManger;//定义类方法
//获取数据函数
- (void)NetWorkTestWithData:(TestSucceedBlock) succeedBlock error:(ErrorBlock) errorBlock;

@end

首先因为dispatch _once可以保证线程安全,static修饰全局变量:然后我们将这个方法写成类方法通过GCD多线程方式实现单例:

+ (instancetype)sharedManger {
	//1.如果onceToken=0时,线程执行dispatch_once的block中代码
	//2.当onceToken=-1时,线程跳过dispatch_once的block中代码不执行
	//3.当onceToken为其他值时,线程被阻塞,等待onceToken值改变
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (manger == nil) {
            manger = [[BeanFlapMainViewManger alloc] init];
        }
    });
    return manger;
}
//执行流程:
/*1.当线程调用shareInstance,此时onceToken = 0,调用block中的代码。 
2.当其他线程再调用shareInstance方法时,onceToken的值已经是非0非-1的,线程阻塞。
3.当block线程执行完block之后,onceToken变为-1.其他线程不再阻塞,跳过block。
4.下次再调用shareInstance时,block已经为-1.直接跳过block。*/

然后我们将.h文件中的获取数据方法进行实现:

-(void)NetWorkTestWithData:(TestSucceedBlock)succeedBlock error:(ErrorBlock)errorBlock{
    NSString *json = @"http://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 *country = [[TestModel alloc] initWithData:data error:nil];
            succeedBlock(country);
        } else {
            errorBlock(error);
        }

        }];
    //任务启动
        [testDataTask resume];
}

然后在ViewController.m中:

-(void)test{
    [[Manager sharedManger] NetWorkTestWithData:^(TestModel * _Nonnull mainViewNowModel) {
        NSLog(@"%@",mainViewNowModel.stories[0]);
            NSLog(@"请求成功");
        } error:^(NSError * _Nonnull error) {
            NSLog(@"请求失败");
        }];
}

我们在需要使用的时候:

[self test];//就可以直接调用了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值