iOS 性能优化:实战案例分享
摘要: 本文将深入探讨 iOS 性能优化的重要性,并通过一系列实际开发案例,展示如何解决常见的性能问题,包括内存管理、CPU 性能、网络性能、UI 性能和启动性能等方面的优化,帮助 iOS 开发者打造更流畅、高效的应用程序。
一、引言
在当今竞争激烈的移动应用市场中,性能优化对于 iOS 应用的成功至关重要。用户期望应用程序能够快速启动、流畅运行,并且不会出现卡顿或崩溃的情况。然而,随着应用功能的增加和复杂性的提升,性能问题也愈发凸显。因此,作为 iOS 开发者,我们需要掌握性能优化的技术和工具,以确保应用的高质量和良好的用户体验。本文将结合实际开发案例,为大家提供一些解决 iOS 性能优化问题的有效方法。
二、内存优化
案例一:图像加载与内存管理
问题描述: 在开发一款包含大量图片展示的应用(如图片社交应用)时,发现内存使用量会随着用户浏览图片的增多而急剧上升,最终导致应用程序崩溃。
分析过程: 使用 Instruments 的 "Memory Graph Debugger" 和 "Leaks" 工具进行分析,发现主要存在以下两个问题:
- 每次加载图片时,都会将原始高分辨率的图片完整加载到内存中,即使只需要显示缩略图。
- 没有合理的图片缓存机制,导致相同图片在不同页面或列表项中被重复加载,并且未及时释放不再使用的图片资源,造成内存泄漏。
解决方案:
1. 采用图片下采样技术
使用 UIImage
的 downsample
方法将图片下采样为所需的尺寸,避免加载过大的图片到内存中。以下是一个示例代码:
func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage? {let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionaryguard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions) else { return nil }let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scalelet downsampleOptions = [kCGImageSourceCreateThumbnailFromImageAlways: true,kCGImageSourceShouldCacheImmediately: true,kCGImageSourceCreateThumbnailWithTransform: true,kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionaryguard let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions) else { return nil }return UIImage(cgImage: downsampledImage)
}
代码解释:
CGImageSourceCreateWithURL
从 URL 创建图像源。CGImageSourceCreateThumbnailAtIndex
结合下采样选项创建下采样后的图像,避免了直接加载高分辨率图像。
2. 实现高效的图片缓存
使用 NSCache
存储已下载的图片,以减少重复下载和内存占用。以下是示例代码:
class ImageCache {static let shared = ImageCache()private let cache = NSCache<NSString, UIImage>()func cacheImage(_ image: UIImage, forKey key: String) {cache.setObject(image, forKey: key as NSString)}func image(forKey key: String) -> UIImage? {return cache.object(forKey: key as NSString)}
}func loadImage(from url: URL, into imageView: UIImageView) {if let cachedImage = ImageCache.shared.image(forKey: url.absoluteString) {imageView.image = cachedImagereturn}URLSession.shared.dataTask(with: url) { (data, _, error) inif let data = data, let image = UIImage(data: data) {ImageCache.shared.cacheImage(image, forKey: url.absoluteString)DispatchQueue.main.async {imageView.image = image}}}.resume()
}
代码解释:
NSCache
存储已下载的图像,以URL
的字符串作为键。- 在
loadImage
函数中,首先检查缓存中是否存在图像,如果存在则直接使用,否则发起网络请求下载,并在下载完成后缓存图像。
三、CPU 性能优化
案例二:复杂计算和数据处理
问题描述: 在开发一个数据处理密集型应用(如金融分析应用)时,发现执行复杂计算和数据处理任务时,界面出现明显的卡顿现象,严重影响用户体验。
分析过程: 使用 Instruments 的 "Time Profiler" 工具进行分析,发现复杂的计算任务在主线程上执行,阻塞了 UI 线程,导致界面响应延迟。
解决方案:
1. 将计算任务移至后台线程
使用 DispatchQueue
将计算任务移至后台,完成后在主线程更新 UI。以下是示例代码:
func performComplexCalculation() {DispatchQueue.global(qos:.userInitiated).async {let result = self.complexCalculation()DispatchQueue.main.async {self.updateUI(with: result)}}
}func complexCalculation() -> [Int] {// 这里进行复杂的计算,例如排序、过滤、统计等操作var data = [1, 5, 3, 2, 4]data.sort()return data
}func updateUI(with result: [Int]) {// 更新 UI 的操作,例如更新标签、表格或图表的数据self.label.text = "Result: \(result)"
}
代码解释:
DispatchQueue.global(qos:.userInitiated).async
用于将计算任务放到后台线程,避免阻塞主线程。DispatchQueue.main.async
确保在主线程更新 UI,因为 UI 更新操作必须在主线程完成。
2. 使用 GCD 的并发队列
对于可以并发执行的任务,可以使用 DispatchGroup
来管理并发操作。以下是示例代码:
代码解释:
DispatchGroup
用于管理并发任务,确保多个并发任务完成后通知主线程更新 UI。
四、网络性能优化
案例三:网络请求优化
问题描述: 在开发一个网络应用(如新闻客户端)时,页面加载速度慢,尤其是在网络状况不佳的情况下,用户需要长时间等待内容加载。
分析过程: 使用网络分析工具(如 Charles)和 URLSession
的日志,发现网络请求的并发控制不合理,并且没有合理的缓存机制,导致多次重复请求相同的数据。
解决方案:
1. 并发请求管理
使用 OperationQueue
控制并发请求的数量,避免过多的网络请求同时发送。以下是示例代码:
let operationQueue = OperationQueue() operationQueue.maxConcurrentOperationCount = 3 func fetchData(from urls: [URL]) { for url in urls { let operation = BlockOperation { self.fetchData(from: url) } operationQueue.addOperation(operation) } } func fetchData(from url: URL) { URLSession.shared.dataTask(with: url) { (data, _, error) in if let data = data { // 处理数据,更新 UI DispatchQueue.main.async { self.updateUI(with: data) } } }.resume() } func updateUI(with data: Data) { // 更新 UI 的操作 }
代码解释:
operationQueue.maxConcurrentOperationCount
限制了并发操作的数量,避免了网络拥塞。
2. 网络请求缓存
使用 URLCache
缓存网络请求的响应,减少重复请求。以下是示例代码:
let urlCache = URLCache.shared
let request = URLRequest(url: URL(string: "https://example.com/data")!, cachePolicy:.returnCacheDataElseLoad, timeoutInterval: 60)
let session = URLSession.sharedfunc fetchData() {let task = session.dataTask(with: request) { (data, _, error) inif let data = data {// 处理数据,更新 UIDispatchQueue.main.async {self.updateUI(with: data)}}}task.resume()
}
代码解释:
URLCache
存储请求的响应,根据cachePolicy
决定是否使用缓存数据或重新请求。
五、UI 性能优化
案例四:界面流畅性优化
问题描述: 在开发一个列表展示应用(如购物应用的商品列表)时,用户在滚动列表时出现卡顿,界面不够流畅。
分析过程: 使用 Instruments 的 "Core Animation" 工具分析,发现 UITableView
或 UICollectionView
的单元格包含过多的子视图,并且部分 UI 元素使用了复杂的特效,导致渲染性能下降。
解决方案:
1. 简化视图层次结构
减少 UITableViewCell
或 UICollectionViewCell
中的子视图数量,使用 UITextView
或 NSAttributedString
合并文本元素。以下是示例代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell", for: indexPath) as! ProductCelllet attributedText = NSMutableAttributedString(string: "Product Name\n")attributedText.append(NSAttributedString(string: "Product Description", attributes: [.font : UIFont.systemFont(ofSize: 12)])cell.textLabel?.attributedText = attributedTextreturn cell
}
代码解释:
NSAttributedString
用于合并多个文本元素,减少子视图的数量,提高渲染性能。
2. 优化 UI 特效
对于需要使用阴影和透明度的 UI 元素,使用 shouldRasterize
进行优化。以下是示例代码:
class CustomView: UIView {override func awakeFromNib() {super.awakeFromNib()layer.shadowOpacity = 0.5layer.shouldRasterize = truelayer.rasterizationScale = UIScreen.main.scale}
}
代码解释:
layer.shouldRasterize = true
将视图光栅化,提高渲染性能,layer.rasterizationScale
确保了渲染质量。
六、启动性能优化
案例五:缩短应用启动时间
问题描述: 应用启动时需要较长时间,用户等待时间长,影响用户体验。
分析过程: 使用 Instruments 的 "Time Profiler" 和 "System Trace" 工具分析,发现启动时执行了过多的初始化操作,且部分操作在主线程进行,导致启动延迟。
解决方案:
1. 延迟加载和懒加载
使用 lazy
关键字和 DispatchQueue
实现延迟加载和后台初始化。以下是示例代码:
lazy var dataManager: DataManager = {let manager = DataManager()return manager
}()func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {DispatchQueue.global().async {self.dataManager.initialize()}return true
}
代码解释:
lazy
确保dataManager
仅在首次使用时初始化。DispatchQueue.global().async
将初始化操作移至后台线程。
2. 优化资源加载顺序
根据重要性和依赖关系,优化启动时资源的加载顺序。例如,先加载关键资源,再加载非关键资源。以下是示例代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {loadCriticalResources()DispatchQueue.global().async {loadNonCriticalResources()}return true
}func loadCriticalResources() {// 加载关键资源,如核心数据存储、用户认证信息等
}func loadNonCriticalResources() {// 加载非关键资源,如主题、配置等
}
代码解释:
- 优先加载关键资源,将非关键资源的加载移至后台线程,提高启动速度。
七、结论
通过上述几个实际案例,我们可以看到 iOS 性能优化涉及多个方面,从内存、CPU、网络到 UI 和启动性能。在开发过程中,我们需要利用各种工具进行性能分析,找出性能瓶颈,并根据具体情况采取相应的优化措施。性能优化是一个持续的过程,需要不断地测试、调整和优化,以确保应用程序在各种场景下都能为用户提供流畅、高效的体验。希望这些案例能为 iOS 开发者在性能优化的道路上提供有价值的参考和帮助。
以上是一篇完整的 CSDN 博客示例,涵盖了 iOS 性能优化的多个方面和实际案例。你可以根据自己的实际情况对代码和解释进行修改和扩展,也可以让我为你添加更多的案例或对某些部分进行更深入的讲解。在开发过程中,性能优化需要综合考虑各个方面,以达到最佳的效果。你是否在性能优化中遇到过其他问题呢 欢迎在评论区留言讨论。
相关文章:
iOS 性能优化:实战案例分享
摘要: 本文将深入探讨 iOS 性能优化的重要性,并通过一系列实际开发案例,展示如何解决常见的性能问题,包括内存管理、CPU 性能、网络性能、UI 性能和启动性能等方面的优化,帮助 iOS 开发者打造更流畅、高效的应用程序。…...
基于本地消息表实现分布式事务
假设我们有一个电商系统,包含订单服务和库存服务。当用户下单时,需要在订单服务中创建订单,同时在库存服务中扣减库存。这是一个典型的分布式事务场景,我们需要保证这两个操作要么都成功,要么都失败,以保证数据的最终一致性。 项目结构: 订单服务(Order Service)库存服务(Inv…...
select函数
系统调用 select()可用于执行 I/O 多路复用操作,调用 select()会一直阻塞,直到某一个或多个文件描述符成为就绪态(可以读或写)。其函数原型如下所示: #include <sys/select.h> int select(int nfds, fd_set *re…...
自然语言处理——自注意力机制
一、文字表示方法 在自然语言处理中,如何用数据表示文字是基础问题。独热编码(One-hot Encoding )是一种简单的方法,例如对于 “我”“你”“他”“猫”“狗” 等字,会将其编码为如 “我 [1 0 0 0 0 ……]”“你 [0 …...
C语言初阶--函数
目录 1. 函数是什么? 2. C语言中函数的分类 2.1 库函数 2.2 自定义函数 3. 函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4. 函数调用 4.1 传值调用 4.2 传址调用 练习:写一个函数判断一个…...
探索基于机器学习的信用评分:从数据到洞察
友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...
Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘
准备 Ubuntu 24.04 LTSUbuntu 空闲硬盘挂载Ubuntu 安装 Docker Desktop [我的Ubuntu服务器折腾集](https://blog.csdn.net/jh1513/article/details/145222679。 安装 seafile 参考资料 Docker安装 Seafile OnlyOffice 并配置OnlyOffice到Seafile,实现在线编辑…...
【Golang 面试题】每日 3 题(三十六)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
Linux虚拟机安装与FinalShell使用:探索Linux世界的便捷之旅
文章目录 软件准备安装 VMware 虚拟机下载CentOS 光盘镜像文件选择适合的 CentOS 版本选择合适的镜像文件 本教程工具版本 第一部分:安装 Linux 虚拟机1. 启动 VMware 并创建新虚拟机2. 默认硬件兼容性设置3. 安装操作系统的设置4. 选择操作系统类型与版本5. 为虚拟…...
leetcode19-删除链表的第n结点
leetcode 19 思路 要删除倒数第n个元素,那么就要找到倒数第n1个元素,那么我们需要两个指针来记录,首先快指针需要先走n1步,然后快慢指针一起进行移动,直到快指针为null的时候,此时慢指针恰好走到倒数第n…...
多学科视角下探索开源Github、Git初步学习
Think 1.Github 作为现今最主流的代码托管平台、协作平台甚至是“社交平台”,本身是闭源的。一方面,它是和大多数开发者连接最紧密的开源阵地,另一方面,拥有传统“黑客精神”的人认为将用户身份绑定这样一个闭源平台上恰恰与…...
新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵
本博文内容导读📕🎉🔥 ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上,提供了强大的灵活性,能适应不同的应用需求。 ESP32中断主…...
Android 右键后无Java class创建
Android studio 创建java class : 最近几个月用Android studio 开发,因为电脑设置了一个新的用户使用,原来的android studio,打开之前的正常的项目总是报一些奇奇怪怪的错误,就重新安装了最新的版本 问题描述 但是新的android s…...
leetcode-买卖股票问题
309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 动态规划解题思路: 1、暴力递归(难点如何定义递归函数) 2、记忆化搜索-傻缓存法(根据暴力递归可变参数确定缓存数组维度) 3、严格表结构依…...
如何通过 Apache Airflow 将数据导入 Elasticsearch
作者:来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排(schedule)和监控工作流的平台。它用于编排 ETL(Extract-Transform-Load࿰…...
LDPC (Low-Density Parity-Check) 码min_sum、n_0、block_length 和 rate参数
1. min_sum 1; min_sum 是与 最小和解码算法(Min-Sum Decoding Algorithm)相关的参数。最小和解码算法是 LDPC 码的一种常用解码方法,主要通过传递信号的信息在接收端进行解码。此参数表示最小和算法中的缩放因子。 在 LDPC 解码过程中&am…...
基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)
个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境:最好是java jdk 1.8,我们在这个平台…...
(二)afsim第三方库编译(qt编译)
注意:源码编译的路径不能有中文否则报错,压缩包必须用官网下载的xz格式解压的才可以,否则sudo ./configure命令找不到 先编译openssl3.1.1软件包,否则编译的qt库将不支持network,相关库的编译(上文(一&…...
重学SpringBoot3-Spring Retry实践
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-Spring Retry实践 1. 简介2. 环境准备3. 使用方式 3.1 注解方式 基础使用自定义重试策略失败恢复机制重试和失败恢复效果注意事项 3.2 编程式使用3.3 监听重试过程 监…...
极域电子教室破解(JiyuTrainer)
JiyuTrainer下载 byebye极域电脑安装包也可以使用 如果只玩单机游戏最简单的办法就是拔网线 另一种办法安装360卫士通过360卫安全卫士上网设置来进行禁用JiyuTrainer网络跟拔网线一样...
Oracle数据库传统审计怎么用
Oracle数据库传统审计怎么用 审计功能开启与关闭By Session还是By AccessWhenever Successful数据库语句审计数据库对象审计查看审计策略和记录Oracle数据库审计功能分为传统审计(Traditional Auditing)和统一审计(Unified Auditing)。统一审计是从Oracle 12c版本开始引入的…...
windows 搭建flutter环境,开发windows程序
环境安装配置: 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后,随便找个地方解压,然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了࿰…...
基于SpringBoot的健身房管理系统【源码+文档+部署讲解】
系统介绍 基于SpringBootVue实现的健身房管理系统采用前后端分离架构方式,系统设计了管理员、会员、员工三种角色,系统实现了用户登录与注册、个人中心、会员管理、员工管理、会员卡管理、会员卡类型管理、教练信息管理、解聘管理、健身项目管理、指导项…...
2.slf4j入口
文章目录 一、故事引入二、原理探究三、SLF4JServiceProvider四、总结 一、故事引入 故事要从下面这段代码说起 public class App {private static final Logger logger LoggerFactory.getLogger(App.class);public static void main( String[] args ) throws Exception {lo…...
sql_实用查询语句模版
1. 查询某个字段是否为必填项 SQL 查询模板 SELECT COLUMN_NAME,IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME YourTableNameAND COLUMN_NAME YourColumnName;说明: INFORMATION_SCHEMA.COLUMNS 表包含了所有数据库中表的列信息。IS_NULLABL…...
Nginx反向代理架构介绍
Nginx反向代理架构是一种强大的服务器架构模式,它位于用户和原始服务器之间,接收用户的请求并将其转发到一个或多个后端服务器,然后将从后端服务器获取的响应返回给用户,就好像这些内容都是由代理服务器本身直接提供的一样。以下是…...
Mysql MVCC
MVCC 什么是MVCC MVCC(多版本并发控制,Multi-Version Concurrency Control) 是一种用于数据库管理系统(DBMS)中的并发控制机制,它允许多个事务同时执行而不互相阻塞,并通过创建数据的多个版本…...
JavaEE之CAS
上文我们认识了许许多多的锁,此篇我们的CAS就是从上文的锁策略开展的新概念,我们来一探究竟吧 1. 什么是CAS? CAS: 全称Compare and swap,字⾯意思:“比较并交换”,⼀个CAS涉及到以下操作: 我们假设内存中…...
Flink CDC 使用实践以及遇到的问题
背景 最近公司在做一些业务上的架构调整,有一部分是数据从mysql采集到Starrocks,之前的一套方法是走 debezium 到 puslar 到 starrocks,这一套下来比较需要配置很多东西,而且出现问题以后,需要修改很多配置,而且现阶段…...
idea上git log面板的使用
文章目录 各种颜色含义具体的文件的颜色标签颜色🏷️ 节点和路线 各种颜色含义 具体的文件的颜色 红色:表示还没有 git add 提交到暂存区绿色:表示已经 git add 过,但是从来没有 commit 过蓝色:表示文件有过改动 标…...
03.选择排序
一、题目思路 选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大ÿ…...
麒麟V10系统上安装Oracle
以下是在麒麟V10系统上安装Oracle数据库的详细步骤: 安装前准备 检查系统版本:使用uname -a、cat /etc/os-release等命令检查服务器是麒麟V10系统。 配置固定IP和本地yum源: 挂载麒麟V10的iso文件到/mnt目录,如mount -o loop Ky…...
PyTorch 神经协同过滤 (NCF) 推荐系统教程
目录 教程概述1. 神经协同过滤模型概述NCF 模型的主要组成部分: 2. 数据加载与预处理3. 定义神经协同过滤模型4. 训练模型5. 模型评估6. 推荐物品7. 完整示例8. 总结 在本教程中,我们将使用 PyTorch 实现一个神经协同过滤(Neural Collaborat…...
日志收集Day001
1.ElasticSearch 作用:日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml(这里yy做了别名,过滤掉空行和注释行) yy /etc/el…...
【氮化镓】香港科技大学陈Kevin-单片集成GaN比较器
一、引言(Introduction) GaN HEMT的重要性 文章开篇便强调了氮化镓(GaN)高电子迁移率晶体管(HEMT)在下一代功率转换系统中的巨大潜力。GaN HEMT具备高开关频率、低导通电阻、高击穿电压以及宽工作温度范围等优势,使其成为功率电子领域的热门研究对象。这些特性使得GaN…...
LDD3学习9--数据类型和定时器
这部分对应的是第七章和第十一章,因为内容也不是很多,就一起写了。里面的内容基本上就是一个个的点,所以也就一个个点简单总结一下。 1 数据类型 1.1 数据长度 不同操作系统类型长度可能不一样,看图的话最好用u8,u16&…...
性价比1.2V电压基准替代
前言: 小于2V的电压基准比较少,且价格稍贵,对于要求不高的场合,1117可以替代使用,温度系数低于 100ppm/C, 价格便宜。 1117是线性稳压器的一种,一般情况下,输出电压可调。 如下述的1117…...
【青蛙过河——思维】
题目 图解 代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int n, x; int h[N]; bool check(int mid) {for(int i 1; i mid - 1 < n; i)if(h[i mid - 1] - h[i - 1] < 2 * x) return false;return true; } int main() {cin >> …...
【数据库】MySQL数据库SQL语句汇总
目录 1.SQL 通用语法 2.SQL 分类 2.1.DDL 2.2.DML 2.3.DQL 2.4.DCL 3.DDL 3.1.数据库操作 3.1.1.查询 3.1.2.创建 3.1.3.删除 3.1.4.使用 3.2.表操作 3.2.1.查询 3.2.2.创建 3.2.3.数据类型 3.2.3.1.数值类型 3.2.3.2.字符串类型 3.2.3.3.日期时间类型 3.2…...
Vue3 Element-Plus el-tree 右键菜单组件
参考代码:实现Vue3Element-Plus(tree、table)右键菜单组件 这篇文章的代码确实能用,但是存在错误,修正后的代码: <template><div style"text-align: right"><el-icon size"12" color"#…...
学成在线_内容管理模块_创建模块工程
学成在线模块工程 1.各个微服务依赖基础工程2.每个微服务都是一个前后端分离的项目3.xuecheng-plus-content:内容管理模块工程xuecheng-plus-content-modelxuecheng-plus-content-servicexuecheng-plus-content-api 1.各个微服务依赖基础工程 2.每个微服务都是一个前…...
Swift 专题二 语法速查
一 、变量 let, var 变量是可变的,使用 var 修饰,常量是不可变的,使用 let 修饰。类、结构体和枚举里的变量是属性。 var v1:String "hi" // 标注类型 var v2 "类型推导" let l1 "标题" // 常量class a {…...
vue2配置跨域后请求的是本机
这个我来说明一下,因为我们公司的后端设置解决了跨域问题,所以我有很久没有看相关的内容了,然后昨天请求了需要跨域的接口,请求半天一直不对,浏览器显示的是本机地址,我以为是自己配置错了,后面…...
Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP
文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…...
IT程序设计文档,软件需求设计文档,详细设计模板(Word原件)
1引言 1.1编写目的 1.2项目背景 1.3参考材料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性…...
画流程图 代码生成流程图 流程图自动运行
一:在线平台 典藏 drawio:完全免费;可拆入代码生成;使用方法 Kimi drawio生成流程图:Kimi里面生成Mermaid格式——>生成代码并复制——>进入drawio里面点插入"号"——>高级——>Mermaid——…...
庄小焱——2024年博文总结与展望
摘要 大家好,我是庄小焱。岁末回首,2024 年是我在个人成长、博客创作以及生活平衡方面收获颇丰的一年。这一年的经历如同璀璨星辰,照亮了我前行的道路,也为未来的发展奠定了坚实基础。 1. 个人成长与突破 在 2024 年,…...
Unity3d 实时天气系统基于UniStorm插件和xx天气API实现(含源码)
前言 实时天气在Unity3d三维数字沙盘中的作用非常重要,它能够增强虚拟环境的真实感和互动性,实时天气数据的应用可以提供更为精准和直观的天气信息支持,如果真实的数据加上特效、声音和模型反馈会提高产品档次,提高真实感。 目前…...
【学习总结|DAY032】后端Web实战:登录认证
在 Web 后端开发中,登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例,深入探讨登录功能与登录校验的实现思路和技术细节,希望能帮助读者更好地掌握这一重要知识点。 一、登录功能实现 1.1 思路分析 登录功能的核心…...
在 C++ 中实现调试日志输出
在 C 编程中,调试日志对于定位问题和优化代码至关重要。有效的调试日志不仅能帮助我们快速定位错误,还能提供有关程序运行状态的有价值的信息。本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳。 1. 使用 #ifdef _DEBUG…...