「iOS」——AFNetworking的简单使用

ops/2024/10/25 14:35:35/

iOS学习

  • 前言
  • 原生网络请求
  • 使用AFNetworking库进行网络请求
    • 具体使用
  • 单例创建的原因
    • 单例使用
  • 总结

前言

我们之前学习了通过OC原生内容进行网络申请,AFNetworkikng第三方库的使用,可以极大地简化网络申请的代码量。


原生网络请求

网络请求主要分为上面五个步骤,下面直接给出代码:

  • 创建请求地址
  • 创建请求类
  • 创建会话
  • 根据会话创建任务
  • 启动任务
-(void)creatURL
{//创建请求地址NSString *urlString1 = [NSString stringWithFormat:@"https://devapi.qweather.com/v7/weather/3d?location=%@&key=你的key",self.array_city[self.flag]];urlString1 = [urlString1 stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];NSURL *url1 = [NSURL URLWithString:urlString1];//创建请求类NSURLRequest *request1 = [NSURLRequest requestWithURL:url1];NSURLSessionConfiguration *config1 = [NSURLSessionConfiguration defaultSessionConfiguration];//创建会话NSURLSession *session1 = [NSURLSession sessionWithConfiguration:config1 delegate:self delegateQueue:[NSOperationQueue mainQueue]];//根据会话创建任务NSURLSessionTask *task1 = [session1 dataTaskWithRequest:request1];self.datatask01 = task1;//启动任务[task1 resume];  
}//接受服务器响应
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{NSLog(@"didReceiveResponse");if(dataTask == self.datatask01) {if (self.data1 == nil) {self.data1 = [[NSMutableData alloc] init];} else {self.data1.length = 0;}}//允许数据接受completionHandler(NSURLSessionResponseAllow);
}//接收到数据,该方法会被调用多次-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{NSLog(@"didReceiveData");if (dataTask == self.datatask01) {[self.data1 appendData:data];}
}//数据请求完成或者请求出现错误调用的方法
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{NSLog(@"didCompleteWithError");// 在 URLSession:task:didCompleteWithError: 方法中if (task == self.datatask01) {if (error == nil) {NSMutableDictionary *dictBianYi = [NSJSONSerialization JSONObjectWithData:self.data1 options:kNilOptions error:nil];NSMutableArray *arrValue = [[NSMutableArray alloc] init];arrValue = dictBianYi[@"daily"];[self.arrWeNeed addObjectsFromArray:arrValue];} else {NSLog(@"errol = %@",error);}}
}

使用AFNetworking库进行网络请求

相比于我们自己实现网络请求,使用AFNetworking让网络请求更简便

我们并不需要自己操作NSURLNSURLRequestNSURLSession,也不需要实现Task回调、调用resume
我们只需要实现下面一段代码即可:
请添加图片描述

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

具体使用

GET请求为例:

- (void)dataLoader {[[AFHTTPSessionManager manager] GET:@"https:/news-at.zhihu.com/api/4/story-extra/9776246" parameters:nil headers:nil progress:^(NSProgress * _Nonnull downloadProgress) {//} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"%@",responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"error:%@",error);}];
}

请添加图片描述

单例创建的原因

通常在一个项目中,我们需要多次进行网络申请。当我们在不同页面都创建对象时,会额外耗费很多内存。因此通过一个单例统一实现网络申请,可以节省内存空间,减少代码量便于维护。

单例使用

@implementation Mangerstatic Manger *mangerSington = nil;+ (instancetype)sharedSingleton {static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{mangerSington = [[super allocWithZone:NULL] init];});return mangerSington;
}+ (instancetype)allocWithZone:(struct _NSZone *)zone {return [Manger sharedSingleton];
}- (id)copyWithZone:(NSZone *)zone {return [Manger sharedSingleton];
}- (void)NetWorkWithData:(void(^)(Model *testModel))success andError:(void(^)(NSError *error))failure {AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];NSString* str = @"https:/news-at.zhihu.com/api/4/story-extra/9776246";[manager GET:str parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {Model* model = [Model yy_modelWithJSON:responseObject];success(model); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {failure(error);}];
}

使用GCD加锁保证线程安全。
在ViewController中,我们调用该单例模式

#import "ViewController.h"
#import "Manger.h"
#import "Model.h"
@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];id manger = [Manger sharedSingleton];[manger NetWorkWithData:^(Model *testModel) {NSLog(@"%@", [Model yy_modelToJSONString]);} andError:^(NSError *error) {NSLog(@"error:%@", error);}];
}@end

打印结果:
请添加图片描述

总结

AFNetworking作为一个高效的第三方库,简化了网络申请的代码量。使用起来十分便捷。


http://www.ppmy.cn/ops/128361.html

相关文章

Python中的人工智能框架与实例

在人工智能(AI)领域,Python因其简洁的语法、丰富的库和强大的社区支持,成为了最受欢迎的编程语言之一。本文将详细介绍Python中的人工智能框架,并通过具体实例展示如何使用这些框架来实现不同的人工智能应用。 一、Python中的人工智能框架 …

【PyTorch】轻松应对 PyTorch 安装:兼容性问题解析

目录 引言1. 环境要求1.1 Python 版本1.2 操作系统1.3 CUDA 支持1.4 其他依赖项 2. 安装 PyTorch2.1 安装命令解析2.2 安装示例 3. PyTorch 安装错误3.1 错误原因分析3.2 错误处理步骤 4. 解决方案4.1 检查 Python 版本4.2 更新 pip4.3 安装特定版本4.4 降低 conda 中的 Python…

list的使用与实现

1.list的使用 list本质上是一个带头双向循环链表&#xff0c;因此遍历的时候不支持下标随机访问[ ] 1.2.list的构造函数 list有四种默认构造函数 无参构造 list<int> l1; //构造空的l1 n个val值构造 list<int> l2 (4,100); //l2中构造4个值为100的数 迭代器构…

webAPI中的节点操作、高级事件

一、节点操作 1.删除节点 node.removeChild(); 方法从node节点中删除一个子节点&#xff0c;返回删除的节点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

webpack 老项目升级记录:从 node-sass 限制的的 node v8 提升至支持 ^node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步&#xff1a;vue2 升级到最新 第一步&#xff1a;升级 vue2 至最新版本&#xff0c;截止到目前&#xff08;2024-10-…

【小白学机器学习16】 概率论的世界观2: 从正态分布去认识世界

目录 1 从正态分布说起 1.1 正态分布的定义 1.2 正态分布的名字 1.3 正态分布的广泛&#xff0c;和基础性 2 正态分布的公式和图形 2.1 正态分布 2.2 标准正态分布 3 正态分布的认识的3个层次 3.1 第1层次&#xff1a;个体的某个属性的样本值&#xff0c;服从正态分布…

neo4j 中日期时间 时间戳处理

### 使用指定格式&#xff08;默认ISO&#xff09;和指定时区&#xff08;默认当前TZ&#xff09;&#xff0c;使用指定单位&#xff08;默认ms&#xff09;获取时间值的字符串表示形式&#xff08;可选&#xff09; 测试 return apoc.date.format(1729380807273,(ms),(yyyy-…

当遇到 502 错误(Bad Gateway)怎么办

很多安装雷池社区版的时候&#xff0c;配置完成&#xff0c;访问的时候可能会遇到当前问题&#xff0c;如何解决呢&#xff1f; 客户端&#xff0c;浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面&#xff0c;因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…