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

iOS网络之异步加载

为什么你的图片要异步加载?

在仿写天气预报时,我们常常需要从网络加载天气图标,例如显示某个小时的天气状态图标。这看似简单的事情,如果处理不当,却很容易造成界面卡顿,甚至影响整个 App 的用户体验。

错误做法:图片同步加载会让 UI 卡顿

假设你在展示天气时这样加载图标:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
self.weatherIcon.image = [UIImage imageWithData:data];

这段代码有什么问题?它会直接在主线程中进行网络请求和图片解码:

  • 如果网络慢,用户界面会卡住甚至假死

  • 如果在滑动列表(比如 TableView)中这么做,滚动会非常不流畅

  • 图片越大,问题越明显

在 iOS 中,主线程负责所有界面渲染、用户交互。一旦主线程被你“堵住”,就会引发体验崩溃。


 正确做法:异步加载 + 主线程更新 UI

为了保证用户界面流畅,我们应当把耗时操作放到后台线程去执行,只在主线程中更新 UI。下面是一段优化后的代码:

- (void)loadWeatherIcon:(NSString *)urlString {NSURL *url = [NSURL URLWithString:urlString];NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:urlcompletionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (data) {UIImage *image = [UIImage imageWithData:data];dispatch_async(dispatch_get_main_queue(), ^{self.weatherIcon.image = image;});}}];[task resume];
}

解释:

  • dataTaskWithURL: 默认就在系统分配的后台线程池中运行

  • dispatch_async(dispatch_get_main_queue(), ^{ ... }) 是我们手动回到主线程更新 UI

  • 整个过程对用户而言是丝滑无感的异步体验

http://www.lryc.cn/news/598769.html

相关文章:

  • 医疗设备自动化升级:Modbus TCP与DeviceNet的协议协同实践
  • vue3使用异步加载腾讯地图
  • 低速信号设计之 JTAG 篇
  • Spring Bean生命周期七步曲:定义、实例化、初始化、使用、销毁
  • Datawhale AI夏令营学习笔记:大模型微调与数据处理实践
  • 01_FOC学习之先让电机转动起来
  • 长糖链皂苷的生物合成研究进展-文献精读149
  • FreeRTOS—计数型信号量
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(3)
  • 【自动化运维神器Ansible】Ansible常用模块之shell模块详解
  • 深入解析Hadoop NameNode的Full GC问题、堆外内存泄漏及元数据分治策略
  • Lua(数组)
  • DBA常用数据库查询语句(2)
  • 详解FreeRTOS开发过程(六)-- 队列
  • Redis操作
  • PostgreSQL 跨库查询方法
  • CMake ARGV变量使用指南
  • 基于C语言的Zynq SOC FPGA嵌入式裸机设计和开发教程
  • 外企本土化布局对国内连接器企业影响几何?
  • 模型的存储、加载和部署
  • rust-切片类型
  • centos7中把nginx更新到1.26 版(centos7默认只能更新到1.20)
  • IROS-2025 | OIKG:基于观察-图交互与关键细节引导的视觉语言导航
  • 【LeetCode 热题 100】39. 组合总和——(解法一)选或不选
  • windwos11网页切换残留/卡屏/冻结/残影问题
  • Java学习---Spring及其衍生(下)
  • 基于SpringBoot+Vue的电脑维修管理系统(WebSocket实时聊天、Echarts图形化分析)
  • 类和包的可见性
  • 磁性材料如何破解服务器电源高频损耗难题?
  • Linux C 网络基础编程