当前位置: 首页 > article >正文

【iOS】AFNetworing初步学习

文章目录

  • 前言
  • OC的网络请求步骤
  • 单例封装网络请求
  • 使用AFNetworking进行网络请求

前言

在暑假,学习了一些简单的网络请求的内容,本周学习了AFNetworking的基本使用,通过本篇博客进行一个简单的介绍。

OC的网络请求步骤

简单的网络请求主要有以下几个步骤:

  1. 创建请求地址
  2. 创建请求类
  3. 创建会话
  4. 根据会话创建任务
  5. 启动任务

下面给出示例代码:

-(void) pleaseURL:(NSString*)cityID
{
    NSLog(@"现在的时间");
    NSString* urlString = [NSString stringWithFormat:@"https://devapi.qweather.com/v7/weather/now?location=%@&key=b0e66b20297d457898b69ea7b94ee119",cityID];
    //创建一个NSURL对象
    NSURL* url = [NSURL URLWithString:urlString];
    //创建一个NSURLRequest对象
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    //创建一个NSURLSession对象,用于管理和执行网络请求。
    NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
    //创建一个NSURLSessionTask对象,用于执行特定的网络请求并且使用complotionHander回调来获取请求到的数据和处理错误
    NSURLSessionTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData* data, NSURLResponse* response, NSError* error) {
        if(error) {
           
        }else {
            //JSON格式的内容转化成为OC中的字典,便于我们使用其中的内容。
            NSDictionary *weatherData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
            if(error) {
                
            } else {
                 
                NSDictionary* dic = weatherData[@"now"];
                NSString* str1 = dic[@"obsTime"];
                NSLog(@"%@", str1);
                NSString* str2 = [str1 substringWithRange:NSMakeRange(11, 5)];
                [self.cityobsTime addObject:str2];
                [self.citytext addObject:dic[@"text"]];
                self.icon = dic[@"icon"];
                NSString* str3 = [NSString stringWithFormat:@"%@°", dic[@"temp"]];
                [self.citytemp addObject:str3];
                NSLog(@"OK");
            }
        }
    }];
    [task resume];
    
   });
}

这里只进行一个简单的介绍,也可以看看笔者的另一篇博客【iOS】APP仿写——天气预报,其中介绍的比较详细。

单例封装网络请求

在天气预报仿写中,因为有许多个页面,每个页面中都需要从网络中请求数据,因此笔者就创建多个对象来请求不同的网络数据,但是这无疑浪费了内存,如果有一个单例专门负责进行网络请求,就不会出现这样的问题,同时将网络请求逻辑封装到一个单例类中,这个类负责创建、管理和发送网络请求。这样,你可以将网络请求的相关代码集中在一个地方,以提高代码的可维护性和可读性。

//创建一个单例
+ (instancetype)shareManager {
    if (!managerSington) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            managerSington = [[Manager allocWithZone:NULL] init];
        });
    }
    return managerSington;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    return [Manager shareManager];
}

在这里的创建单例中,使用了GCD,以确保代码块仅被执行一次,从而确保线程安全。

static dispatch_once_t onceToken;:这是用于确保代码块只执行一次的GCD的dispatch_once_t变量。

dispatch_once(&onceToken, ^{ ... }):这是GCD的dispatch_once函数,它接受一个 dispatch_once_t 变量和一个代码块作为参数。它确保代码块中的代码只会在第一次调用时执行,以后的调用会被忽略。

使用AFNetworking进行网络请求

AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
    NSString* url = @"https://news-at.zhihu.com/api/4/version/ios/2.3.0";
    
    [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            TestYYModel* model = [TestYYModel yy_modelWithJSON:responseObject];
        NSLog(@"%@", [model yy_modelToJSONString]);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"error:%@", error);
        }];

下面介绍一下GET请求数据的几个参数:

  1. 第一个参数是存放我们的URL,也就是我们的网络请求的地址。
  2. 第二个参数是我们要发送的请求的查询数据,在get请求中我们一般放在URL中间,这里注意下在POST请求时,需要使用一个字典来进行一个请求
  3. 第三个参数是header,在大部分请求中我们是不需要的,但是在部分要求比较严格的API中,可能就需要运用到这个参数
  4. 第四个参数是一个可以选择的块,一般用于大文件的下载中
  5. success则是请求成功后回调块,failure则是请求失败后的回调块

打印结果:

{"msg":"【更新内容】\r\n\r\n★ 多图有标记 流量壕忽略\r\n★ 出门前离线 没网也能看\r\n★ 喜欢请好评 不喜快吐槽\r\n★ 萌妹工程师 邮箱在下面\r\nmua@zhihu.com\r\n(一般人我们不告诉他)","status":"1","latest":"2.5"}

http://www.kler.cn/news/357925.html

相关文章:

  • openresty“热部署“lua
  • 【Linux】如何通过系统宏定义,获取进程的退出码或退出信号
  • 使用Python在Jupyter Notebook中显示Markdown文本
  • 前端工程师面试题整理
  • 【C语言教程】【嵌入式编程】(一)介绍与前提条件(二)嵌入式编程基础(三)硬件基础知识(四)硬件寄存器操作
  • linux运行openfoam并行会报错:attempt to run parallel on 1 processor
  • 多个版本的GCC(GNU编译器集合)可以同时安装并存
  • 官龙村捐赠图书整理有感
  • Next.js 学习 - 生命周期
  • Docker技术深度解析与实战案例
  • Java中的String类
  • K8s-pod控制器HPA、DS、Job、CJ
  • 【GeekBand】C++设计模式笔记8_Factory Method_工厂方法
  • Android判断蓝牙设备类型
  • 运算符优先级有没有通用原则?
  • 在 PostgreSQL 通过Select语句中动态生成 INSERT 和 UPDATE 语句
  • uniapp获取底部导航tabbar的高度(H5)
  • AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo
  • 前端实现下载功能汇总(下载二进制流文件、数组下载成csv、将十六进制下载成pcap、将文件下载成zip)
  • 国庆旅游高峰期,如何利用可视化报表来展现景区、游客及消费数据