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.pswp.cn/news/916518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916518.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#值類型屬性的典型問題

問題復現:值類型屬性的副本問題以下代碼展示了值類型屬性的典型問題:struct Point {public int X;public int Y; }class MyClass {public Point Position {get; set;} }// 使用屬性修改結構體(無效!) var obj new MyC…

機器學習基礎-k 近鄰算法(從辨別水果開始)

一、生活中的 "分類難題" 與 k 近鄰的靈感 你有沒有這樣的經歷:在超市看到一種從沒見過的水果,表皮黃黃的,拳頭大小,形狀圓滾滾。正當你猶豫要不要買時,突然想起外婆家的橘子好像就是這個樣子 —— 黃色、圓…

【WPF】NumericUpDown的用法

在 WPF(Windows Presentation Foundation)中,NumericUpDown 控件并不是內置的標準控件之一,但它是一個非常常用的控件,用于讓用戶輸入一個數值(整數或浮點數),并提供上下箭頭來遞增或…

Kotlin位運算

Kotlin 提供了幾種用于操作整數各個位(bit) 的運算符。這些操作是由處理器直接支持的,速度快且操作簡單。在底層編程中非常重要,比如設備驅動、低級圖形處理、網絡通信、加密和壓縮等。 盡管計算機通常都有高效的硬件指令來執行算…

墨者:通過手工解決SQL手工注入漏洞測試(MongoDB數據庫)

一、SQL手工注入漏洞測試(MongoDB數據庫) 本文以墨者學院靶場為例,演示MongoDB數據庫的手工SQL注入全過程。靶場以自己的地址為準:http://124.70.71.251:42286/new_list.php?id1 二、注入原理說明 MongoDB作為NoSQL數據庫,其注入方式與傳…

Kafka——CommitFailedException異常處理深度解析

引言在分布式消息系統Kafka的生態中,消費者組(Consumer Group)機制是實現高吞吐量和負載均衡的核心設計。然而,消費過程中位移提交(Offset Commit)的穩定性始終是開發者面臨的最大挑戰之一。當消費者嘗試提…

kafka的部署和jmeter連接kafka

zookeeper的安裝 kafka依賴Zookeeper所以要先安裝Zookeeper kafka的安裝文章引用來源:Kafka下載和使用(linux版)-CSDN博客 通過wget命令安裝 # 安裝wget https://downloads.apache.org/zookeeper/stable/apache-zookeeper-3.7.1-bin.tar.gz# 解壓tar…

Android UI 組件系列(八):ListView 基礎用法與適配器詳解

博客專欄:Android初級入門UI組件與布局 源碼:通過網盤分享的文件:Android入門布局及UI相關案例 鏈接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd4k9n 提取碼: 4k9n 一、引言 在上一篇文章《Android UI 組件系列(…

Android學習專題目錄(持續更新)

1.Android 調試 1.1:Logcat日志分析 2.Android編譯 2.1:android編譯過程中的mk文件和bp文件的掃描機制 2.2:Android 構建系統中常見的 .mk 文件及其作用 2.3:Android構建系統中的mk文件語法函數 2.4:安卓中定…

c#Lambda 表達式與事件核心知識點整理

一、Lambda 表達式1. 概念 Lambda 表達式是一種匿名函數(無名稱的函數),簡化了委托和匿名方法的寫法,格式為: (參數列表) > 表達式或語句塊 它可以作為參數傳遞,或賦值給委托類型變量。2. 基本語法與簡寫…

Springboot+Layui英語單詞學習系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBootLayUI框架持久層框架MyBaits成功系統案例:參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸…

主要分布于內側內嗅皮層的層Ⅲ的邊界向量細胞(BVCs)對NLP中的深層語義分析的積極影響和啟示

邊界向量細胞(Boundary Vector Cells, BVCs)主要分布于內側內嗅皮層(MEC)層Ⅲ,通過編碼環境邊界(如墻壁、障礙物)的距離和方向信息,為空間導航提供幾何參考框架。這一神經機制對自然…

Selenium是解決了什么問題的技術?

Selenium 是一種用于自動化瀏覽器操作的技術,主要解決了以下問題:1. 自動化測試 Selenium 最初是為了解決 Web 應用程序的自動化測試 問題而設計的。它可以幫助開發者和測試人員: 模擬用戶操作:如點擊按鈕、填寫表單、選擇下拉菜單…

JavaSE知識點(2)

目錄 訪問修飾符的區別 this關鍵字的作用 抽象類和接口有什么區別 抽象類可以定義構造方法嗎 但是接口不可以定義構造方法 Java支持多繼承嗎 接口可以多繼承嗎 繼承和抽象的區別? 抽象類和普通類的區別 成員變量和局部變量的區別? staic關鍵字…

(實用教程)Linux操作系統(二)

centos配置靜態ip 注意: 1.系統中的網關要與虛擬機編輯器中的網關保持一致 2.如果配置虛擬機編輯器后發現ping不通外網的時候,就要還原默認設置再進行配置 總結: 虛擬機編輯器需要配置ip,網關,其中ip網段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例實現

ThinkPHP8集成RabbitMQ的完整案例實現一、安裝依賴:需通過Composer安裝php-amqplib庫?二、配置RabbitMQ三、生產者1、發送一個郵件,將任務發送到RabbitMQ隊列中。2、運行結果展示四、啟動消費者:命令行執行php think rabbitmq:consumer1&…

解密負載均衡:如何輕松提升業務性能

什么是負載均衡 負載均衡:Load Balance,簡稱LB,是一種服務或基于硬件設備等實現的高可用反向代理技術,負載均衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個后端特定的服務器或設備,從而提高了 公司業務的…

mac neo4j install verifcation

本文使用conda環境安裝,neo4j所依賴jdk也采用conda install的方式安裝。 1 neo4j下載 點擊如下鏈接,選擇community, Linux/Mac Executor,點擊Download Community。 本文下載的安裝包是 neo4j-community-2025.06.2-unix.tar.gz 2 安裝neo4j …

【Oracle】Oracle分區表“排雷“指南:當ORA-14400錯誤找上門時如何優雅應對

引言:分區表里的"定時炸彈"凌晨三點的機房,你盯著屏幕上刺眼的ORA-14400: 插入的分區鍵值超出所有分區范圍錯誤,后背發涼。這個錯誤就像埋在分區表里的定時炸彈,一旦觸發就會讓整個應用癱瘓。但別慌!本文將帶…

設計模式(十四)行為型:職責鏈模式詳解

設計模式(十四)行為型:職責鏈模式詳解職責鏈模式(Chain of Responsibility Pattern)是 GoF 23 種設計模式中的行為型模式之一,其核心價值在于將多個處理對象(處理器)連接成一條鏈&am…