iOS 网络图片异步加载 swift

本文主要目的是简单介绍三种异步加载图片的方法,核心在异步

一般 app 开发都是用第三方库如 SDWebImage

 

因为是从网上下载图片,而如果网速不太OK的话,下载的时候UI界面会卡住(方法阻塞在这里,下面的代码没法执行)

所以不能在主线程里下载图片。下面介绍3种方法,在新开的线程中下载。

 

假设 现在我在ViewController里添加了一个button,一个UIImageView  名字 imgView 。给button加了一个click1点击事件。

// button的点击事件

     func click1(){

// 方法一,线程

         let thread = Thread(target: self, selector: #selector(download), object: nil)

         // thread 执行的方法 download() 在后面

         thread.start()      

     }

     // 下载事件. 把下载的相关代码封装在这里

     func download() {  

         let url = URL(string: "https://avatar.csdn.net/0/2/9/1_m0_38076563.jpg")

         // 新建一个URL(这个URL里是个图片)  

         let data = Data(contentsOf: url!)

         let img = UIImage(data: data! ) 

         imgView?.performSelector(onMainThread: Selector("setImage:"), with: img!, waitUntilDone: false)

         //  在主线程里更新 img,下面是更常用的办法     

     }

 

 // 第二个办法,队列(GCD)

队列存放任务,GCD 会自动将队列中的任务取出,放到合适的线程中执行

任务就是 一个 block,代码片段

队列有两种: 并发队列和串行队列

1. 串行队列: 任务一个接一个的执行,上一个任务执行不完,下一个永远就没有机会去执行(单线程)

2. 并行队列: 允许多个任务同时执行(队列内有多个线程)

 

func click(){

         let gcd_queue = DispatchQueue(label: "Test")  // 新起一个队列

         //synchronize:同步,asynchronize:异步

         gcd_queue.async() { // 队列内安排一个任务:

         

         let url = URL(string: "https://avatar.csdn.net/0/2/9/1_m0_38076563.jpg")

         let data = Data(contentsOf: url!)

         let img = UIImage(data: data! )

        

         DispatchQueue.main.async(execute: { // 在主线程更新 UI,因此向主线程所在的队列提交一个任务:

             self.imgView.image = img

         })

    }

 

// 第三个方法,OperationQueue,只需要提交任务就行了

func click(){

    // 队列里添加操作:

OperationQueue().addOperation {

            let url = URL(string:"https://avatar.csdn.net/0/2/9/1_m0_38076563.jpg")

            let data = NSData(contentsOf: url!)

            let img = UIImage(data: data!asData

            self.imgView.performSelector(onMainThread: Selector("setImage:"), with: img!, waitUntilDone: false)

        }

        //  可以设置队列的 maxConcurrentOperationCount = 3  // 允许最大并发操作数

    }

 
当然,使用 URLSessionTask 下载网络图片还可以看到加载进度,但是本文核心是简单介绍三种异步方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值