• iOS——Manager封装网络请求


    • 在之前的项目里,我们都是把网络请求写在viewController的viewDidLoad,而实际中使用的时候并不能这么简单,对于不同的需要,我们需要有不同的网络请求。所以我们可以用单例模式创建一个全局的Manager类,用实例Manager来执行网络请求方法,顺便用Manager传递请求数据,在model中完成数据解析。

    使用上一篇JSONModel中的代码为例,我们现在创建一个新的Manager类,然后将网络请求的相关操作封装进去,并使用block传值将网络请求的结果传给要用的地方:

    
    #import "JSONModel.h"
    #import "QianTaoJSONModel.h"
    
    //用了block传值
    //_Nonnull 是 Objective-C 中的一个关键字,用于标记变量、参数或返回类型。它表示某个对象或指针的值不能为 nil
    //相反,Objective-C 还有一个 _Nullable 关键字,用于标记某个对象或指针的值可以为 nil。
    typedef void (^DataBlock)(QianTaoJSONModel * _Nonnull mainModel);
    typedef void (^ErrorBlock)(NSError * _Nonnull error);
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface Manager : JSONModel
    
    + (instancetype)sharedManager;
    - (void)NetWorkWithData: (DataBlock)dataBlock error: (ErrorBlock) errorBlock;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    
    #import "Manager.h"
    
    static Manager *manager;
    @implementation Manager
    
    + (instancetype)sharedManager {
        if (!manager) {
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                manager = [Manager new];
            });
        }
        return manager;
    }
    
    - (void)NetWorkWithData:(nonnull DataBlock)dataBlock error:(nonnull ErrorBlock)errorBlock {
        NSString *urlString = [[NSString alloc] init];
        urlString = @"https://news-at.zhihu.com/api/4/news/latest";
        urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
        NSURL *url = [NSURL URLWithString:urlString];
        NSLog(@"%@", urlString);
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLSession *session = [NSURLSession sharedSession];
        //根据会话创建任务
        NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if (error == nil) {
                QianTaoJSONModel *t = [[QianTaoJSONModel alloc] initWithData:data error:nil];
                dataBlock(t);
            } else {
                errorBlock(error);
            }
        }];
        [dataTask resume];
    }
    
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    以上就是Manager的封装。
    这时候,我们就可以直接使用封装好的网络请求了。在viewController中,我们先声明一个test方法,在test方法中我们创建Manager对象并打印该对象的数据。在[viewDidLoad]中我们调用该方法即可:

    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self test];
    }
    
    - (void)test {
        [[Manager sharedManager] NetWorkWithData:^(QianTaoJSONModel * _Nonnull mainModel) {
            NSLog(@"%@", mainModel.top_stories[0]);
        } error:^(NSError * _Nonnull error) {
            NSLog(@"ERROR");
        }];
    }
    
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    结果:在这里插入图片描述

  • 相关阅读:
    Netty 线程工作机制—— NioEventLoop
    后端研发工程师面经——计算机网络
    IDEA安装JAVA_HOME报错、启动界面卡死的解决方案
    LeetCode_位运算_中等_318.最大单词长度乘积
    【毕业云】基于Java的高校学生会管理系统的设计和开发方案及技术栈
    四、hdfs文件系统基础操作-保姆级教程
    偶数矩阵判断【C语言作业】
    Keras学习记录之模型
    自创Web框架之过度Django框架
    单链表头尾指针
  • 原文地址:https://blog.csdn.net/m0_73348697/article/details/133886405