Swift语言的网络编程
Swift语言的网络编程探秘
随着移动互联网的迅猛发展,网络编程已经成为开发者必备的核心技能之一。尤其在iOS开发领域,Swift语言作为Apple官方推荐的编程语言,以其简洁的语法和强大的功能受到了广泛的关注。本文将深入探讨Swift语言的网络编程,涵盖基础知识、常用库、实际应用以及最佳实践。
一、网络编程基础
在深入讨论Swift的网络编程之前,我们首先来了解一些网络编程的基本概念。
1.1 网络协议
网络协议是计算机网络中用于通信的规则和约定。常见的网络协议包括:
- HTTP/HTTPS:超文本传输协议,HTTP是用于在Web上进行数据传输的主要协议,HTTPS是其安全版本,使用SSL/TLS加密传输。
- TCP/IP:传输控制协议/互联网协议,是网络通信中的基础协议,确保数据能够在网络中正确传输。
1.2 RESTful API
REST(Representational State Transfer)是一种架构风格,常用于构建Web服务的一种方式。RESTful API遵循一些特定的约定,例如:
- 使用HTTP方法(GET、POST、PUT、DELETE)进行不同操作。
- 通过URL标识资源。
- 使用JSON或XML格式传递数据。
二、Swift中的网络编程
Swift提供了多种方式进行网络编程,最常用的有URLSession、Alamofire等。
2.1 URLSession
URLSession
是Swift中进行网络请求的标准API。它提供了一种简单的方式来创建和管理网络请求。
2.1.1 基本用法
下面是一个使用URLSession
发起HTTP GET请求的示例:
```swift import Foundation
let url = URL(string: "https://api.example.com/data")! let task = URLSession.shared.dataTask(with: url) { data, response, error in // 处理错误 if let error = error { print("Error: (error.localizedDescription)") return }
// 确保我们得到了数据
guard let data = data else { return }// 解析 JSON 数据
do {if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {print(json)}
} catch {print("JSON parsing error: \(error)")
}
}
// 启动任务 task.resume() ```
2.1.2 POST请求
除了GET请求,有时我们需要发送数据到服务器,这时可以使用POST请求。以下是一个使用URLSession
发送POST请求的示例:
```swift import Foundation
let url = URL(string: "https://api.example.com/data")! var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let parameters: [String: Any] = ["key": "value"] request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: [])
let task = URLSession.shared.dataTask(with: request) { data, response, error in // 处理错误 if let error = error { print("Error: (error.localizedDescription)") return }
// 确保我们得到了数据
guard let data = data else { return }// 解析 JSON 数据
do {if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {print(json)}
} catch {print("JSON parsing error: \(error)")
}
}
// 启动任务 task.resume() ```
2.2 Alamofire
虽然URLSession
能够满足基本的网络请求需求,但在复杂的网络编程中,我们往往需要一个更为强大且易于使用的库。此时,Alamofire就派上了用场。它是一个基于NSURLSession
的Swift网络库,提供了简单而优雅的网络请求方法。
2.2.1 设置Alamofire
在项目中使用Alamofire,可以通过CocoaPods或Swift Package Manager进行安装,以下是CocoaPods的安装方式:
ruby pod 'Alamofire', '~> 5.4'
安装完成后,我们可以在项目中导入Alamofire:
swift import Alamofire
2.2.2 基本请求
使用Alamofire发起HTTP GET请求非常简单,如下所示:
swift AF.request("https://api.example.com/data").responseJSON { response in switch response.result { case .success(let value): print("Response JSON: \(value)") case .failure(let error): print("Error: \(error)") } }
POST请求也同样简单:
swift let parameters: [String: Any] = ["key": "value"] AF.request("https://api.example.com/data", method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in switch response.result { case .success(let value): print("Response JSON: \(value)") case .failure(let error): print("Error: \(error)") } }
2.3 响应解析与错误处理
无论是使用URLSession
还是Alamofire,响应的解析和错误处理都是网络编程中不可或缺的部分。我们需要正确处理网络请求中的错误情况,如网络不可用、超时以及响应码等。同时,还要确保对返回数据做适当解析以供后续使用。
三、实际应用案例
3.1 用户登录功能
假设我们需要为一个移动应用程序实现用户登录功能,使用Alamofire进行实现。
3.1.1 登录请求
我们可以定义一个LoginManager来处理登录请求:
```swift import Alamofire
class LoginManager { static let shared = LoginManager()
func login(username: String, password: String, completion: @escaping (Bool) -> Void) {let url = "https://api.example.com/login"let parameters: [String: Any] = ["username": username, "password": password]AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response inswitch response.result {case .success(let value):if let json = value as? [String: Any], let success = json["success"] as? Bool {completion(success)} else {completion(false)}case .failure(let error):print("Error: \(error)")completion(false)}}
}
} ```
3.1.2 使用LoginManager
在你的ViewController中,可以这样使用LoginManager进行登录:
swift LoginManager.shared.login(username: "testUser", password: "testPassword") { success in if success { print("登录成功") } else { print("登录失败") } }
3.2 数据获取与展示
假设我们需要获取某个API中的用户数据并展示在列表中,可以使用UITableView进行展示。
3.2.1 数据模型
首先,我们定义一个User模型:
swift struct User: Codable { let id: Int let name: String let username: String let email: String }
3.2.2 数据获取
然后,我们使用Alamofire请求用户数据:
```swift func fetchUsers(completion: @escaping ([User]) -> Void) { let url = "https://api.example.com/users"
AF.request(url).responseDecodable(of: [User].self) { response inswitch response.result {case .success(let users):completion(users)case .failure(let error):print("Error: \(error)")completion([])}
}
} ```
3.2.3 在UITableView中展示数据
在你的ViewController中,可以这样调用fetchUsers并将结果展示在UITableView中:
```swift var users: [User] = []
override func viewDidLoad() { super.viewDidLoad()
fetchUsers { [weak self] users inself?.users = usersDispatchQueue.main.async {self?.tableView.reloadData()}
}
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return users.count }
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) let user = users[indexPath.row] cell.textLabel?.text = user.name return cell } ```
四、最佳实践
在进行Swift的网络编程时,有一些最佳实践可以帮助我们更高效、可靠地管理网络请求。
4.1 使用模型化数据
使用Codable协议定义模型可以让我们便捷地解析和生成JSON数据,降低出错率。
4.2 异常处理与重试机制
处理网络请求时,要做好错误处理,并考虑实现重试机制,以提高用户体验。
4.3 使用异步编程
使用Swift的异步编程特性,如async/await
,可以让代码更简洁易读,避免回调地狱。
4.4 合理使用缓存
合理使用网络请求的缓存机制,可以减少不必要的网络流量,提高应用性能。
4.5 实现统一的网络管理
封装网络请求的逻辑,可以避免在多个地方重复代码,方便维护和扩展。
五、总结
Swift语言在网络编程领域提供了强大的支持,无论是基础的URLSession
还是高效的第三方库Alamofire,都能帮助开发者轻松实现各种网络请求。通过合理的架构设计和最佳实践,我们能构建出高效、稳定的网络应用。
在这个日新月异的技术时代,持续学习和践行网络编程的最佳实践,将使开发者们在竞争中立于不败之地。希望本文能为你在Swift网络编程的道路上提供一些有益的帮助与指导。
相关文章:
Swift语言的网络编程
Swift语言的网络编程探秘 随着移动互联网的迅猛发展,网络编程已经成为开发者必备的核心技能之一。尤其在iOS开发领域,Swift语言作为Apple官方推荐的编程语言,以其简洁的语法和强大的功能受到了广泛的关注。本文将深入探讨Swift语言的网络编程…...
江科大STM32入门——UART通信笔记总结
wx:嵌入式工程师成长日记 1、简介 简单双向串口通信有两根通信线(发送端TX和接收端RX)TX与RX要交叉连接当只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片 传输模式:全双工;时钟&…...
2. 使用springboot做一个音乐播放器软件项目【框架搭建与配置文件】
上一章文章 我们做了 音乐播放器这个项目的 前期规划 项目需求, 环境安装 和 springboot框架的 搭建与配置。如果有小伙伴没看过 第一章文章 可以去看一下 https://blog.csdn.net/Drug_/article/details/144994317 今天这篇文章 我们来 主要分享一些 我们在开发中…...
历代iPhone运行内存大小和电池容量信息
系列设备名称充电端口标配充电线PD快充无线充电 (W)标配充电器电池容量 (mAh)发布时间RAM运存iPhone 16iPhone 16 Pro MaxUSB Type-CUSB-C to USB-C支持25无47472024/9/108GB LPDDR5XiPhone 16 ProUSB Type-CUSB-C to USB-C支持25无35772024/9/108GB LPDDR5XiPhone 16 PlusUSB …...
(STM32笔记)十二、DMA的基础知识与用法 第三部分
我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验(1)DMA结构体解释(2…...
ThinkPHP 8高效构建Web应用-获取请求对象
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
深入解析 Python 2 与 Python 3 的差异与演进
Python 2 和 Python 3 是 Python 编程语言的两个主要版本。Python 3 于 2008 年发布,旨在解决 Python 2 中的一些设计缺陷,并引入了许多新特性。虽然 Python 2 在很长一段时间内仍然被广泛使用,但自 2020 年 1 月 1 日起,Python 2…...
57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景
57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer(WebGL渲染器) THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…...
移动端可互动轮播图
首先通过事件监听获得到初始滑动位置,并关闭掉轮播图的自动轮播定时器 //设置事件代理 $(".slider").on("touchstart", function (e) {// 当滑动触发的时候关闭定时器clearInterval(time);// 开始时的pxstartX e.touches[0].clientX; }); 然…...
深入讲解 Docker 及实践
Docker 是现代化应用开发、测试和生产环境部署中不可或缺的工具。它能够为开发人员提供与生产环境一致的开发环境,同时支持高效的容器化部署、资源隔离、容器编排等高级功能。尤其在微服务架构和云原生应用中,Docker 更是提供了简化的流程和高效的可扩展…...
科大讯飞前端面试题及参考答案( 上)
前端有用到哪些数据结构? 在前端开发中,会运用到多种数据结构,以下是一些常见的类型及其应用场景。 数组(Array) 数组是一种有序的元素集合,可以存放不同类型的数据(在 JavaScript 等前端常用语言中)。比如在构建一个网页的列表展示时,像新闻列表、商品列表等,我们可…...
本地导入封装的模块 在docker内报错ImportError
本地封装了一个login方法 在写testcase的时候去复用这个方法 但是进入docker运行的时候一直报上面的错误 目录 出现的原因: 解决方法: 1. 根据docker的路径写绝对路径 2. 用sys 加入path到code 作用: 好处: 出现的原因…...
Java-日志技术大全
一:目录 1.jul的使用 2.log4j的使用 3.logback的使用 4.log4j2的使用 二:jul使用 jul是JDK自带的日志技术,不需要导入其他依赖,默认的级别为info 1.关键组件: (1).Logger:记录器 (2).Handler&…...
ARP-Batch-Retargeting 部署实战
git 地址: https://github.com/Shimingyi/ARP-Batch-Retargeting bpy安装: pypi上搜索 bpy bpy 4.3.0,4.2.0版本报错: Traceback (most recent call last):File "E:\project\jijia_4d\retarget\ARP-Batch-Retargeting-…...
二分查找题目:寻找峰值 II
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题:寻找峰值 II 出处:1901. 寻找峰值 II 难度 7 级 题目描述 要求 一个二维网格中的峰值元素是指其值严格大于相邻值(左、…...
调和级数不为整数的证明
文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3:2.4 核心证明: 3. 参考 1. 问题引入 s ( n ) 1 1 2 1 3 ⋯ 1 n , n ∈ N ∗ , n ≥ 2 s(n) 1\frac{1}{2}\frac{1}{3}\cdots\frac{1}{n}, \quad \\n \in N^*, n \ge2 s(n)12131⋯n1,…...
Redis 源码分析-内部数据结构 dict
Redis 源码分析-内部数据结构 dict 在上一篇 Redis 数据库源码分析 提到了 Redis 其实用了全局的 hash 表来存储所有的键值对,即下方图示的 dict,dict 中有两个数组,其中 ht[1] 只在 rehash 时候才真正用到,平时都是指向 null&am…...
git相关操作笔记
git相关操作笔记 1. git init git init 是一个 Git 命令,用于初始化一个新的 Git 仓库。执行该命令后,Git 会在当前目录创建一个 .git 子目录,这是 Git 用来存储所有版本控制信息的地方。 使用方法如下: (1ÿ…...
STM32小实验2
定时器实验 TIM介绍 TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…...
Oracle Dataguard(主库为双节点集群)配置详解(2):备库安装 Oracle 软件
Oracle Dataguard(主库为双节点集群)配置详解(2):备库安装 Oracle 软件 目录 Oracle Dataguard(主库为双节点集群)配置详解(2):备库安装 Oracle 软件一、Orac…...
基于 Pod 和 Service 注解的服务发现
基于 Pod 和 Service 注解的服务发现 背景 很多应用会为 Pod 或 Service 打上一些注解用于 Prometheus 的服务发现,如 prometheus.io/scrape: "true",这种注解并不是 Prometheus 官方支持的,而是社区的习惯性用法,要使…...
操作系统之文件的逻辑结构
目录 无结构文件(流式文件) 有结构文件(记录式文件) 分类: 顺序文件 特点: 存储方式: 逻辑结构: 优缺点: 索引文件 目的: 结构: 特点…...
网络分析与监控:阿里云拨测方案解密
作者:俞嵩(榆松) 随着互联网的蓬勃发展,网络和服务的稳定性已成为社会秩序中不可或缺的一部分。一旦网络和服务发生故障,其带来的后果将波及整个社会、企业和民众的生活质量,造成难以估量的损失。 2020 年 12 月: Ak…...
vue实现虚拟列表滚动
<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…...
服务器/电脑与代码仓gitlab/github免密连接
git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…...
用户界面软件03
一种标准的满足不同的非功能性需求的技术是对子系统进行不同的考虑……但是一个用户 界面要求有大量的域层面的信息,以符合比较高的人机工程标准,所以,这些分开的子系统还是 紧密地耦合在一起的。 一个软件架构师的标准反应是将不同的非功能…...
年会抽奖Html
在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…...
(一)Ubuntu20.04版本的ROS环境配置与基本概述
前言 ROS不需要在特定的环境下进行安装,不管你是Ubuntu的什么版本或者还是虚拟机都可以按照教程进行安装。 1.安装ROS 一键安装ros及ros2 wget http://fishros.com/install -O fishros && . fishros 按照指示安装你想要的ros。 ros和ros2是可以兼容的…...
深入分析线程安全问题的本质
深入分析线程安全问题的本质 1. 并发编程背后的性能博弈2. 什么是线程安全问题?3. 源头之一:原子性问题3.1. 原子性问题示例3.2. 原子性问题分析3.3. 如何解决原子性问题? 4. 源头之二:可见性问题4.1. 为什么会有可见性问题&#…...
58. Three.js案例-创建一个带有红蓝配置的半球光源的场景
58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景,并在其中添加一个旋转的球体。通过设置不同的光照参数,可以观察到球体表面材质的变化。 知识点 WebGLRenderer …...
插入实体自增主键太长,mybatis-plaus自增主键
1、问题 spring-boot整合mybtais执行insert语句时,主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2)数据库主键的种子值设置的多少 3、解决问题 1)数据库主键设置的时自增 3)种子值是1 所以排查是数据库的问题 4、继…...
【利用 Unity + Mirror 网络框架、Node.js 后端和 MySQL 数据库】
要实现一个简单的1v1战斗小游戏,利用 Unity Mirror 网络框架、Node.js 后端和 MySQL 数据库,我们可以将其分为几个主要部分:客户端(Unity)、服务器(Node.js)和数据库(MySQL…...
https原理
一、基本概念 1、https概念 https(全称: Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的http通道,简单讲是http的安全版。 2、为啥说http协议不安全呢? 我们用h…...
如何处理京东商品详情接口返回的JSON数据中的缺失值?
1.在 Python 中处理缺失值 使用if - else语句进行检查和处理 假设通过requests库获取了接口返回的 JSON 数据,并使用json模块进行解析,存储在data变量中。 import json import requestsurl "YOUR_API_URL" response requests.get(url) dat…...
window对象
bom dom部分学完了,来看看bom吧~ bom是整个浏览器,本质上bom与dom是包含的关系,window是里面最大的对象 调用的方法默认对象是window,一般都会省略前面的window 创建的全局变量也是属于window的,当然window也可以省…...
(五)ROS通信编程——参数服务器
前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享(P2P)。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关…...
MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)
MySQL常用命令汇总 简介 MySQL是一个广泛使用的开源关系型数据库管理系统,由瑞典的MySQL AB公司开发,现属于Oracle公司。 MySQL支持SQL(结构化查询语言),这是数据库操作的标准语言,用户可以使用SQL进…...
更新至2023年,各省数字经济变量/各省数字经济相关指标数据集(20个指标)
更新至2023年,各省数字经济相关指标数据集(20个指标) 1、时间:更新至2023年,具体时间如下 2、指标:互联网宽带接入端口(万个)(2006-2023)、互联网宽带接入用户(万户)(2…...
聚类系列 (二)——HDBSCAN算法详解
在进行组会汇报的时候,为了引出本研究动机(论文尚未发表,暂不介绍),需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候,发现网络上对于DBSCAN算法的介绍非常多与细致,但…...
【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)
本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果: 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址:https://qianfan.cloud.baidu.com/ 注册成功后&…...
一种更激进的Hook实现方案猜想
XXX原创不原创不清楚,暂定为原创。毕竟windows 大神很多XXX 昨天才发现不是原创,这种方案是VEH HOOK的一种实现方案。VEH HOOK很久很久以前都被广泛使用了。只是自己没听说过。好悲哀呀。。。。 激进的猜想: 如果VEH HOOK在内核态处理异常…...
HTML5实现好看的端午节网页源码
HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…...
微信小程序获取图片使用session(上篇)
概述: 我们开发微信小程序,从后台获取图片现实的时候,通常采用http get的方式,例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…...
RT-DETR融合YOLOv9的下采样模块ADown
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》 一、 模块介绍 论文链接:https://arxiv.org/abs/2402.13616 代码链接&…...
【机器学习案列】学生抑郁可视化及预测分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布
当地时间1月7日,2025年国际消费电子展(CES 2025)在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓(Ultra Magnus)。该人形机器人内置美格智能基于高通QC…...
Linux第一个系统程序---进度条
进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念,我们用一张图来简单的理解一下: 在计算机语言当中: 换行符:\n 回车符:\r \r\n:回车换行 这时候有人可能会有疑问:我在学习C…...
黑马跟学.苍穹外卖.Day04
黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…...
人生第一次面试之依托答辩
今天收到人生的第一场面试,是东华软件集团。答的那是依托答辩,就面了20分钟,还没考算法。其实依托答辩的效果是意料之中的,这次面试也只是想练练手。 目录 静态变量什么时候加载的? 重写和重载有什么区别࿱…...
STM32 : PWM 基本结构
这张图展示了PWM(脉冲宽度调制)的基本结构和工作流程。PWM是一种用于控制功率转换器输出电压的技术,通过调整信号的占空比来实现对负载的精确控制。以下是详细讲解: PWM 基本结构 1. 时基单元 ARR (Auto-reload register): 自动…...