「iOS」——AFNetworking的简单使用

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 Manger

static 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作为一个高效的第三方库,简化了网络申请的代码量。使用起来十分便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA单列集合

List系列集合:添加的元素是 有序、可重复、有索引 Set系列集合:添加的元素是 无序、不重复、无索引 Collection Collection是单列集合的接口,它的功能是全部单列集合都可以继承使用的 public boolean add(E e) 把给定的对象添加到当前集合中 public void …

【大数据学习 | Zookeeper】Zookeeper的选举机制

zookeeper的选举机制分为第一次启动和非第一次启动两种情况。 1. 选举机制 - > 第一次启动 (1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为 LOOKIN…

docker run 命令解析

docker run 命令解析 docker run 命令用于从给定的镜像启动一个新的容器。这个命令可以包含许多选项,下面是一些常用的选项: -d:后台运行容器,并返回容器ID;-i:以交互模式运行容器,通常与 -t …

中国信通院联合中国电促会开展电力行业企业开源典型实践案例征集

自2021年被首次写入国家“十四五”规划以来,开源技术发展凭借其平等、开放、协作、共享的优秀创作模式,正持续成为推动数字技术创新、优化软件生产模式、赋能传统行业转型升级、助力企业降本增效的重要引擎。电力是国民经济的重要基础性产业,…

Atlassian Team ‘24 Europe:推出Rovo、开发人员AI助手、新版Jira等多款AI创新,重塑团队协作

过去一周,Atlassian Team 24 Europe在巴塞罗那盛大举行!展示了Atlassian在推动团队协作和业务发展方面的最新成果与前沿见解。 本文,Atlassian联合创始人兼首席执行官Mike Cannon-Brookes为我们分享了Atlassian在AI创新和系统化工作两项关键任…

2019年计算机网络408真题解析

第一题: 解析:OSI参考模型第5层完成的功能 首先,我们需要对OSI参考模型很熟悉:从下到上依次是:物理层-数据链路层-网络层- 运输层-会话层-表示层-应用层,由此可知,题目要问的是会话层的主要功能…

python 爬虫 入门 二、数据解析(正则、bs4、xpath)

目录 一、待匹配数据获取 二、正则 三、bs4 (一)、访问属性 (二)、获取标签的值 (三)、查询方法 四、xpath 后续:登录和代理 上一节我们已经知道了如何向服务器发送请求以获得数据&#x…

三周精通FastAPI:10 Cookie 参数 和Cookie 参数模型

官方文档:Cookie 参数 - FastAPI Cookie 参数 定义 Cookie 参数与定义 Query 和 Path 参数一样。 源码: from typing import Annotatedfrom fastapi import Cookie, FastAPIapp FastAPI()app.get("/items/") async def read_items(ads_id…

PHP泵的比例流量控制阀放大器

01 PHP 05 PCS005、01 PHP 1 PCS005、01 PHP 2 PCS005、01 PHP 3 PCS005,01 FCV 2 M、01 FCV 3 M、01 PHP 05 PCLS005、01 PHP 1 PCLS005、01 PHP 2 PCLS005、01 PHP 3 PCLS005,FCV比例流量控制阀旨在与Berarma的PHP2和PHP3泵最佳集成,但由于…

戴尔电脑win11找不到D盘的解决办法

新公司给配的戴尔电脑,系统是win11,第一天用的好好地,第二天不知道什么原因,D盘找不到了,在网上搜了好多教程也没用,最后咨询客服,找到了解决办法 若【磁盘管理】界面看不到硬盘分区或无法进入…

比亚迪车机安装第三方应用教程

比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP, 无论是dlink3.0还是4.0都是安卓系统,因此理论上安卓应用是都可以安装的,主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种,直接从电脑端下载安装布…

《计算机视觉》—— 基于dlib库的人检检测

文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装(适用于Windows等操作系统)3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头,检测人脸 一、dlib库的安装 在PyCharm中&…

域渗透AD渗透攻击利用 MS14-068漏洞利用过程 以及域渗透中票据是什么 如何利用

目录 wmi协议远程执行 ptt票据传递使用 命令传递方式 明文口令传递 hash口令传递 票据分类 kerberos认证的简述流程 PTT攻击的过程 MS14-068 漏洞 执行过程 wmi协议远程执行 wmi服务是比smb服务高级一些的,在日志中是找不到痕迹的,但是这个主…

mongodb在linux下的部署

目录 版本部署上传到服务器中创建目录,解压创建mongodb.conf添加环境变量添加到系统服务中centos6 中添加到服务中 重新加载服务并启动卸载,mongodb.conf配置项等 创建用户,设置用户名密码角色启动验证验证 常见知识mongodb角色mongodb.conf配…

如何禁止上班期间浏览无关网站?

禁止员工在上班期间浏览无关网页主要是为了提升工作效率和生产力,确保员工能够专注于工作任务。同时,这种做法有助于降低网络安全风险,防止恶意软件和钓鱼攻击,减少数据泄露和法律风险,维护公司的专业形象,…

数据结构深度优先搜索遍历连通图+非连通图(C语言代码+遍历+终端输入内容)

首先数据结构(C语言版第二版)的关于深度优先搜索遍历连通图的图G4如下: 使用邻接表去创建上面这个无向图&#xff0c;然后再使用书本DFS函数以及DFSTraverse函数实现深度优先搜索遍历 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #…

微调大模型-2-Qwen基座模型使用

下载Qwen源码 Qwen作为中文支持非常nice的模型&#xff0c;很适合用于LLM学习。在云服务器里clone Qwen工程。 git clone https://github.com/QwenLM/Qwen2.5.git原始模型使用主要基于cli_demo.py-命令行调用&#xff0c;web_demo.py-网页调用。 预览这两个文件时&#xff0c…

Python | Leetcode Python题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, rects: List[List[int]]):self.rects rectsself.sum [0]for a, b, x, y in rects:self.sum.append(self.sum[-1] (x - a 1) * (y - b 1))def pick(self) -> List[int]:k randrange(self.sum[-1…

vue3移动端可同时上传照片和视频的组件

uni-app中的uni-file-picker可单独上传照片或视频&#xff0c;但不支持同时上传照片和视频。本篇博客使用image标签和video标签实现移动端&#xff08;H5app小程序&#xff09;中照片和视频的同时上传。 本篇博客采用的是照片和视频的单独上传&#xff0c;但可同时展示&#xf…

Qt(简介)

1. Qt简介 Qt是一个基于C的图形用户界面&#xff08;GUI&#xff09;框架&#xff0c;可以开发可视化人机交互程序&#xff0c;但是这并不是Qt的全部。Qt除了可以绘制漂亮的界面外&#xff0c;还包含很多其他的功能&#xff1a;多线程、数据库、图像处理、音视频处理、网络通信…