【iOS】简单的网络请求
应iOS小组要求,仿写知乎日报需要实现网络请求并解析JSON格式数据,这篇文章仅对基本的网络请求和iOS中的JSON解析作以记录,还涉及到RunLoop的一点小插曲,具体请求过程和原理以后会详细学习!🙏
- 基本网络流程
- 简单的网络请求示例
- JSON解析
- 网络请求图示
- JSON格式也可以通过第三方库JSONModel直接在程序中解析,后续将加以学习🫡
- 网络请求其实可通过第三方库AFNetworking来进行,为我们简化了许多流程,后续将加以学习🤟🏻
- 有关RunLoop的小插曲
基本网络流程
- NSURL(Uniform Resource Locator)
URL可直接理解为请求网址,如:https://v0.yiketianqi.com/api?unescape=1&version=v9&appid=72961936&appsecret=m78Z0m2T&city=北京&unescape=1
其格式为:[协议类型]://[服务器器地址]:[端⼝口号]/[资源层级UNIX⽂文件路路径][⽂文件名]?[查询]#[⽚片段ID]
方法URLWithString:将要请求的地址字符串包装成NSURL对象:

- NSURLRequest
NSURLRequest对象就代表一个请求,

会将NSURL对象以及各种参数设置封装起来,无需设置其他参数时方法+ (instancetype)requestWithURL:(NSURL *)URL;即可
- NSURLSession
一个session可创建多个请求request,并负责接收、发送和处理请求
整个程序中也可以有多个session
创建session方法(单例sharedSession):

session会将request封装成Task:

来处理数据
可以看到,如果请求逻辑没那么复杂,也可直接用第二个方法将NSURL封装成session
-
- NSURLSessionTask

用Task类的resume方法来开启请求
- NSURLSessionTask
简单的网络请求示例
用一个方法dataLoader封装一下,最后在Controller中调用次此方法
- (void)dataLoader {self.dict = [[NSDictionary alloc] init];NSString* urlString = @"https://v0.yiketianqi.com/api?unescape=1&version=v9&appid=72961936&appsecret=m78Z0m2T&city=北京&unescape=1";//处理字符//urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]];//创建urlNSURL* url = [NSURL URLWithString: urlString];//NSURLRequest* request = [NSURLRequest requestWithURL: url];//创建sessionNSURLSession* session = [NSURLSession sharedSession];//创建taskNSURLSessionTask* task = [session dataTaskWithURL: url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error) {//解析数据//self.dict = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error];NSLog(@"%@", data);} else {NSLog(@"请求出现错误:%@", error);}}];//任务启动,开始请求[task resume];
}
JSON解析
请求下来的数据是NSData,二进制流

下面用一个类NSJSONSerialization将该数据转换成对象,用字典接收并打印出来:
self.dict = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error];
NSLog(@"%@", self.dict);

解析成对象我们仍旧看不懂,这里编码格式是Unicode转义序列这就需要JSON解析(Unicode转中文, … , …),网上有许多JSON解析在线工具

网络请求图示
下面用一张图展示网络请求流程:

JSON格式也可以通过第三方库JSONModel直接在程序中解析,后续将加以学习🫡
网络请求其实可通过第三方库AFNetworking来进行,为我们简化了许多流程,后续将加以学习🤟🏻
有关RunLoop的小插曲
编者一开始其实是在main函数里调用并执行请求的,最后发现command Line Tool并没有显示打印内容,咨询了zxb10学长发现原来是RunLoop的问题
RunLoop 是一个事件循环,负责处理各种事件,包括网络请求的回调。在进行异步网络请求时,通常会使用回调函数或代理方法来处理请求的响应。这些回调函数或代理方法需要在 Run Loop 中执行,才能正确地接收和处理网络请求的响应
- 在
main函数中,默认情况下并没有启动RunLoop,因此当网络请求的回调发生时,由于Runloop没有运行,无法处理这些事件,包括打印输出 - 而在
iOS项目中,主线程的RunLoop默认会启动,并且在主RunLoop运行期间,ta会一直处于运行状态,直到应用程序退出。这意味着主线程的RunLoop会不断地处理事件,包括网络请求的回调和其他消息
为了解决这个问题,可以在main函数中创建一个自定义的RunLoop,并在其中执行网络请求。这样,网络请求的回调就能够在正确的上下文中被执行,从而使打印输出能够正常显示
- (void)dataLoader {// 创建一个自定义 Runloop,并运行在主线程上NSRunLoop *runloop = [NSRunLoop mainRunLoop];self.dict = [[NSDictionary alloc] init];NSString* urlString = @"https://v0.yiketianqi.com/api?unescape=1&version=v9&appid=72961936&appsecret=m78Z0m2T&city=北京&unescape=1";//创建urlNSURL* url = [NSURL URLWithString: urlString];//创建sessionNSURLSession* session = [NSURLSession sharedSession];//创建taskNSURLSessionTask* task = [session dataTaskWithURL: url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (!error) {//解析数据self.dict = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error];NSLog(@"%@", self.dict);} else {NSLog(@"请求出现错误:%@", error);}// 停止自定义 RunloopCFRunLoopStop([runloop getCFRunLoop]);}];//任务启动,开始请求[task resume];// 运行自定义 Runloop[runloop run];
}
相关文章:
【iOS】简单的网络请求
应iOS小组要求,仿写知乎日报需要实现网络请求并解析JSON格式数据,这篇文章仅对基本的网络请求和iOS中的JSON解析作以记录,还涉及到RunLoop的一点小插曲,具体请求过程和原理以后会详细学习!🙏 基本网络流程简…...
Vulnhub系列靶机---mhz_cxf: c1f
靶机文档::mhz_cxf: c1f 下载地址:Download (Mirror): 网卡配置 靶机开机后按住shift,出现界面如图,按e键进入安全模式: 找到ro,删除该行后边内容,并将ro 。。。修改为:…...
SDRAM与DRAM
SDRAM(同步动态随机存取内存)和DRAM(动态随机存取内存)都是RAM的一种类型,但是它们工作的方式有所不同。 DRAM:DRAM是最基础的动态随机存取内存,它的工作方式是总线在内存中读取或写入数据的速度…...
数据库基础(一)【MySQL】
文章目录 安装 MySQL修改密码连接和退出数据库服务器使用 systemctl 管理服务器进程配置数据库从文件角度看待数据库查看连接情况 安装 MySQL 这是在 Linux 中安装 MySQL 的教程:Linux 下 MySQL 安装。本系列测试用的 MySQL 版本是 5.7,机器是 centOS7.…...
C++ -- 位运算与常用库函数(ACWING语法基础)
位运算 & 与 | 或 ~ 非 ^ 异或 >> 右移 << 左移 常用操作: 求x的第k位数字 x >> k & 1lowbit(x) x & -x,返回x的最后一位1 常用库函数、 reverse 翻转 翻转一个vector: reverse(a.begin(), a.end(…...
老卫带你学---leetcode刷题(557. 反转字符串中的单词 III)
557. 反转字符串中的单词 III 问题: 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1:输入:s "Lets take LeetCode contest" 输出:"…...
IEEE754 标准存储浮点数
1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准,由国际电工委员会(IEEE)制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则,旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …...
CSS 两栏布局
目录 CSS两栏布局(左列定宽,右列自适应宽) 方法一:浮动margin 方法二:定位margin 方法三:浮动BFC 方法四:Flex布局 方法五:able布局 CSS两栏布局(左列不定宽&#…...
RHCSA常用命令总结
RHCSA回顾 1.Linux学习环境的安装部署 VMware虚拟机rhel9.x 磁盘容量:20GB cpu:1颗2核心 内存:2G 网卡:NAT 新CD/DVD设置镜像源文件 取消显示器的3d支持 (1)安装RHEL9 (2)组件:带有GUI的服务器 (3)分区…...
【Spring Boot】详解restful api
目录 1.restful api 1.1.历史 1.2.内容 1.3.传参 2.Spring Boot中的Restful Api 1.restful api 1.1.历史 RESTful API(Representational State Transferful Application Programming Interface)是一种设计风格,用于构建基于网络的应用…...
LISTAGG 函数
# LISTAGG 函数 对于查询中的每个组,LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序,然后将值串联成一个字符串。 ## 语法: sql LISTAGG( [DISTINCT] aggregate_expression [, delimiter ] ) [ WITHIN GROUP (ORDER BY order_list) ] …...
485modbus转profinet网关连三菱变频器modbus通讯配置案例
本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式,使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关,用户可以有效地管理和监控设备,从…...
1024节日
程序员节日...
【@EnableWebMvc的原理】
用途 启用SpringMvc 的 Java 配置类,代替 xml 格式的配置文件。 一、查看运用(注解 EnableWebMvc ,实现 WebMvcConfigurer ) Component("com.ibicd") EnableWebMvc public class AppConfig implements WebMvcConfigu…...
css3 2d转换transform详细解析与代码实例transform
CSS3 Transform是CSS3的一个模块,其目的是为了通过对元素的变形、旋转、缩放、平移等操作,能够更加丰富的展示页面效果。下面是CSS3 Transform的详细解析与代码实例: transform属性 transform属性用于对元素进行变形操作,其属性…...
点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie
祝各位程序员们1024程序员节快乐🎉🎉🎉 图片来自网络,侵删 前言 在程序员中,有一位人物的不被人熟知,他的贡献甚至比他自身更要出名 C语言之父,UNIX之父——Dennis MacAlistair Ritchie 一…...
找不到msvcp100.dll解决教程
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp100.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题,本文将介绍四个修复msvcp100.dll丢失的方法,帮助读者快速恢复计算机的正常运…...
萃取和constexpr
最近重温了一下萃取发现其与constexpr有相似之处,记录如下。 一、引出萃取 STL的在中心思想是将容器和算法分开,再通过迭代器iterator这一迭代器来将两者粘合起来。 通过迭代器进行算法计算,需要涉及两个问题: 问题一.通常需要…...
决策树完成图片分类任务
数据集要求: 训练集 和 验证集 (要求分好) 图片放置规则 : 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片 举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。 其中猫的文件夹里面…...
Docker 容器全部停止命令
Docker是一个开源的容器化平台,它可以帮助开发者快速构建、部署和运行应用程序。在使用Docker时,我们通常会创建多个容器来运行不同的服务或应用。当我们需要停止所有的容器时,可以使用一些命令来实现。本文将介绍几种常见的停止所有Docker容…...
突破性音源聚合!洛雪音乐实现全网高品质音乐自由
突破性音源聚合!洛雪音乐实现全网高品质音乐自由 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 你是否曾因音乐平台版权限制而无法听到心仪歌曲?是否厌倦了在不同应用间切…...
双ai驱动:借助快马平台ai助手高效完成openclaw应用开发与调优
最近在做一个OpenClaw模型本地部署的项目,发现用AI来开发AI应用真的能事半功倍。OpenClaw本身是个强大的多模态模型,但部署和调优过程中涉及不少代码编写和参数调试的工作。正好InsCode(快马)平台集成了多种AI编程助手,帮我省去了很多重复劳动…...
ECharts饼图隐藏数据实战:如何优雅处理空值项的指示线与Tooltip(附完整代码)
ECharts饼图隐藏数据实战:如何优雅处理空值项的指示线与Tooltip(附完整代码) 在数据可视化项目中,我们经常遇到需要隐藏某些数据项的场景。比如当某个分类的数据值为零或空时,传统的饼图会显示一个极小的扇形区域&…...
跨平台浏览器字体渲染优化:从技术原理到实战应用
跨平台浏览器字体渲染优化:从技术原理到实战应用 【免费下载链接】GreasyFork-Scripts The open source code of this project is used for userscripts (油猴脚本) for desktop browsers, including Font Rendering (Customized) (字体渲染(自用脚本&am…...
AliceSoft游戏文件处理终极指南:从入门到精通的完整解决方案
AliceSoft游戏文件处理终极指南:从入门到精通的完整解决方案 【免费下载链接】alice-tools Tools for extracting/editing files from AliceSoft games. 项目地址: https://gitcode.com/gh_mirrors/al/alice-tools AliceSoft游戏文件处理工具Alice-Tools是一…...
零基础入门:REX-UniNLU中文NLP系统保姆级安装与使用指南
零基础入门:REX-UniNLU中文NLP系统保姆级安装与使用指南 1. 为什么选择REX-UniNLU系统 如果你正在寻找一个简单易用但功能强大的中文自然语言处理工具,REX-UniNLU可能是你的理想选择。这个系统最大的特点就是"开箱即用"——不需要复杂的配置…...
GLM-4.1V-9B-Bate在Multisim电路仿真中的创新结合:视觉检测电路板故障
GLM-4.1V-9B-Bate在Multisim电路仿真中的创新结合:视觉检测电路板故障 1. 引言:当AI视觉遇上电路设计 想象一下这样的场景:你刚完成一块电路板的设计,正准备在Multisim中进行仿真验证。突然发现某个元器件似乎焊接不良ÿ…...
SEO 项目如何进行链接建设_SEO 项目如何进行品牌形象优化
SEO 项目如何进行链接建设_SEO 项目如何进行品牌形象优化 SEO 项目如何进行链接建设 在当今的互联网时代,网站的流量和排名直接关系到企业的发展和市场竞争力。其中,搜索引擎优化(SEO)是提升网站在搜索引擎中的排名的重要手段。…...
PCIe新手必看:3层体系结构详解(附实战避坑指南)
PCIe三层体系结构深度解析:从原理到实战避坑指南 刚接触PCIe总线的工程师们,常常会被其复杂的协议栈和晦涩的专业术语所困扰。作为现代计算机系统中至关重要的高速串行总线标准,PCIe凭借其分层架构设计,在保证兼容性的同时实现了性…...
避坑指南:Qt菜单栏triggered信号连接的5个常见错误及解决方法
Qt菜单栏triggered信号连接的5个实战避坑指南 在Qt开发中,菜单栏作为用户交互的重要组件,其点击事件处理看似简单却暗藏玄机。许多开发者都曾掉进过信号槽连接失效、内存泄漏或窗口阻塞的陷阱里。今天我们就来剖析这些高频问题背后的原因,并提…...
