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

【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方法来开启请求

简单的网络请求示例

用一个方法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 。。。修改为&#xff1a…...

SDRAM与DRAM

SDRAM(同步动态随机存取内存)和DRAM(动态随机存取内存)都是RAM的一种类型,但是它们工作的方式有所不同。 DRAM:DRAM是最基础的动态随机存取内存,它的工作方式是总线在内存中读取或写入数据的速度…...

数据库基础(一)【MySQL】

文章目录 安装 MySQL修改密码连接和退出数据库服务器使用 systemctl 管理服务器进程配置数据库从文件角度看待数据库查看连接情况 安装 MySQL 这是在 Linux 中安装 MySQL 的教程:Linux 下 MySQL 安装。本系列测试用的 MySQL 版本是 5.7,机器是 centOS7.…...

C++ -- 位运算与常用库函数(ACWING语法基础)

位运算 & 与 | 或 ~ 非 ^ 异或 >> 右移 << 左移 常用操作&#xff1a; 求x的第k位数字 x >> k & 1lowbit(x) x & -x&#xff0c;返回x的最后一位1 常用库函数、 reverse 翻转 翻转一个vector&#xff1a; reverse(a.begin(), a.end(…...

老卫带你学---leetcode刷题(557. 反转字符串中的单词 III)

557. 反转字符串中的单词 III 问题&#xff1a; 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a;输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"…...

IEEE754 标准存储浮点数

1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准&#xff0c;由国际电工委员会&#xff08;IEEE&#xff09;制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则&#xff0c;旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …...

CSS 两栏布局

目录 CSS两栏布局&#xff08;左列定宽&#xff0c;右列自适应宽&#xff09; 方法一&#xff1a;浮动margin 方法二&#xff1a;定位margin 方法三&#xff1a;浮动BFC 方法四&#xff1a;Flex布局 方法五&#xff1a;able布局 CSS两栏布局&#xff08;左列不定宽&#…...

RHCSA常用命令总结

RHCSA回顾 1.Linux学习环境的安装部署 VMware虚拟机rhel9.x 磁盘容量&#xff1a;20GB cpu:1颗2核心 内存&#xff1a;2G 网卡&#xff1a;NAT 新CD/DVD设置镜像源文件 取消显示器的3d支持 &#xff08;1&#xff09;安装RHEL9 (2)组件&#xff1a;带有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&#xff08;Representational State Transferful Application Programming Interface&#xff09;是一种设计风格&#xff0c;用于构建基于网络的应用…...

LISTAGG 函数

# LISTAGG 函数 对于查询中的每个组&#xff0c;LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序&#xff0c;然后将值串联成一个字符串。 ## 语法: sql LISTAGG( [DISTINCT] aggregate_expression [, delimiter ] ) [ WITHIN GROUP (ORDER BY order_list) ] …...

485modbus转profinet网关连三菱变频器modbus通讯配置案例

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…...

1024节日

程序员节日...

【@EnableWebMvc的原理】

用途 启用SpringMvc 的 Java 配置类&#xff0c;代替 xml 格式的配置文件。 一、查看运用&#xff08;注解 EnableWebMvc &#xff0c;实现 WebMvcConfigurer &#xff09; Component("com.ibicd") EnableWebMvc public class AppConfig implements WebMvcConfigu…...

css3 2d转换transform详细解析与代码实例transform

CSS3 Transform是CSS3的一个模块&#xff0c;其目的是为了通过对元素的变形、旋转、缩放、平移等操作&#xff0c;能够更加丰富的展示页面效果。下面是CSS3 Transform的详细解析与代码实例&#xff1a; transform属性 transform属性用于对元素进行变形操作&#xff0c;其属性…...

点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie

祝各位程序员们1024程序员节快乐&#x1f389;&#x1f389;&#x1f389; 图片来自网络&#xff0c;侵删 前言 在程序员中&#xff0c;有一位人物的不被人熟知&#xff0c;他的贡献甚至比他自身更要出名 C语言之父&#xff0c;UNIX之父——Dennis MacAlistair Ritchie 一…...

找不到msvcp100.dll解决教程

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp100.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;本文将介绍四个修复msvcp100.dll丢失的方法&#xff0c;帮助读者快速恢复计算机的正常运…...

萃取和constexpr

最近重温了一下萃取发现其与constexpr有相似之处&#xff0c;记录如下。 一、引出萃取 STL的在中心思想是将容器和算法分开&#xff0c;再通过迭代器iterator这一迭代器来将两者粘合起来。 通过迭代器进行算法计算&#xff0c;需要涉及两个问题&#xff1a; 问题一.通常需要…...

决策树完成图片分类任务

数据集要求&#xff1a; 训练集 和 验证集 &#xff08;要求分好&#xff09; 图片放置规则 &#xff1a; 一个总文件夹 放类别名称的子文件夹 其中子文件夹 为存放同一类别图片 举个例子 分类动物 则 总文件夹名称为动物 子文件夹为 猫 狗 猪猪 。。。 其中猫的文件夹里面…...

Docker 容器全部停止命令

Docker是一个开源的容器化平台&#xff0c;它可以帮助开发者快速构建、部署和运行应用程序。在使用Docker时&#xff0c;我们通常会创建多个容器来运行不同的服务或应用。当我们需要停止所有的容器时&#xff0c;可以使用一些命令来实现。本文将介绍几种常见的停止所有Docker容…...

实战演练:在快马平台模拟环境中验证智能车赛高级策略

作为一名参加过智能车竞赛的选手&#xff0c;我深知算法策略验证的重要性。以往我们需要反复在实车上调试&#xff0c;既耗时又容易损坏硬件。最近发现InsCode(快马)平台的模拟环境特别适合做赛前验证&#xff0c;今天就分享如何用它搭建完整的智能车策略测试系统。 赛道环境建…...

trackerjacker硬件推荐:选择最佳无线网卡提升监控效果

trackerjacker硬件推荐&#xff1a;选择最佳无线网卡提升监控效果 【免费下载链接】trackerjacker Like nmap for mapping wifi networks youre not connected to, plus device tracking 项目地址: https://gitcode.com/gh_mirrors/tr/trackerjacker trackerjacker是一款…...

Qwen3.5-2B轻量化部署:4GB显存GPU跑通多模态推理的完整环境配置

Qwen3.5-2B轻量化部署&#xff1a;4GB显存GPU跑通多模态推理的完整环境配置 1. 模型概述 Qwen3.5-2B是Qwen3.5系列中的轻量化多模态基础模型&#xff0c;仅有20亿参数规模&#xff0c;专为低功耗、低门槛部署场景设计。该模型具有以下核心特点&#xff1a; 资源占用低&#…...

如何判断 SEO 排名推广的投资是否值得

SEO 排名推广的投资是否值得&#xff1a;深入分析与实用建议 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;排名推广已成为许多企业获取在线流量和潜在客户的重要手段。面对高昂的SEO推广费用&#xff0c;企业往往会纠结于“这笔投资是否值得”这一问…...

黑丝空姐-造相Z-Turbo构建AI编程助手:自动生成前端组件配图

黑丝空姐-造相Z-Turbo构建AI编程助手&#xff1a;自动生成前端组件配图 想象一下这个场景&#xff1a;你正在为一个航空公司的内部管理系统编写前端代码&#xff0c;需要创建一个“机组人员资料卡”组件。你已经写好了HTML结构和CSS样式&#xff0c;但卡在了头像占位符上——是…...

零基础玩转YOLO11目标跟踪:完整环境一键部署教程

零基础玩转YOLO11目标跟踪&#xff1a;完整环境一键部署教程 1. 环境准备与快速部署 1.1 系统要求 操作系统&#xff1a;Linux (推荐Ubuntu 20.04/22.04)硬件配置&#xff1a; GPU&#xff1a;NVIDIA显卡 (建议RTX 3060及以上)显存&#xff1a;至少8GB内存&#xff1a;16GB及…...

零基础玩转Qwen3-VL-8B:上传图片提问,本地AI助手秒答

零基础玩转Qwen3-VL-8B&#xff1a;上传图片提问&#xff0c;本地AI助手秒答 1. 项目简介 Qwen3-VL-8B是一款基于阿里云通义实验室最新多模态模型开发的本地交互工具。它最大的特点就是能让你的电脑变成一个"会看图的智能助手"——你上传一张照片&#xff0c;然后像…...

TensorRT-LLM与Triton Server部署实战:从环境配置到模型推理

1. 环境准备&#xff1a;从零搭建TensorRT-LLM与Triton Server基础环境 第一次接触TensorRT-LLM和Triton Server时&#xff0c;我花了整整三天时间在环境配置上踩坑。现在回想起来&#xff0c;大部分问题都源于对NVIDIA生态工具链的不熟悉。下面我会用最直白的语言&#xff0c;…...

【从0开始学设计模式-6| 原型模式】

一个月没更新了&#xff0c;在找实习。。 其实还是懒了&#xff0c;其实每天花个半小时左右就能写一篇博客的。。。概念 原型模式(Prototype Pattern) 设计出来的目标就是&#xff1a;通过本体复制出与本体一样的分身&#xff08;分身具有本体一样特性&#xff09;定义&#xf…...

Retinaface+CurricularFace模型部署实战:Windows11环境配置全攻略

RetinafaceCurricularFace模型部署实战&#xff1a;Windows11环境配置全攻略 想在Windows11上快速搭建人脸识别系统却苦于环境配置&#xff1f;本文手把手带你避开所有坑&#xff0c;30分钟完成RetinafaceCurricularFace的完整部署。 1. 环境准备&#xff1a;搞定CUDA和cuDNN …...