[Swift通天遁地]四、网络和线程-(2)通过BlockOperation实现线程的队列

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10222194.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

目录:[Swift]通天遁地Swift

本文将演示线程队列的使用,使用线程队列可以依次执行一系列的任务。

在项目导航区,打开视图控制器的代码文件【ViewController.swift】

现在开始编写代码,使用线程队列功能,依次下载网络上的两张图片。

  1 import UIKit
  2 
  3 class ViewController: UIViewController {
  4     
  5     //添加两个图像视图属性,用来显示下载的两张图片。
  6     var topImageView = UIImageView()
  7     var footImageView = UIImageView()
  8     
  9     override func viewDidLoad() {
 10         super.viewDidLoad()
 11         // Do any additional setup after loading the view, typically from a nib.
 12         
 13         //初始化一个图像视图,并设置它的显示区域
 14         topImageView = UIImageView(frame: CGRect(x: 0, y: 0,  320, height: 280))
 15         //然后将该图像视图添加到根视图中
 16         self.view.addSubview(topImageView)
 17         
 18         //初始化一个图像视图,并设置它的显示区域
 19         footImageView = UIImageView(frame: CGRect(x: 0, y: 280,  320, height: 290))
 20         //然后将该图像视图添加到根视图中,该图像视图位于第一个图像视图的下方。
 21         self.view.addSubview(footImageView)
 22         
 23         //通过一个方法,获得一个阻塞操作对象,设置该对象的参数
 24         let downloadA = getOperation(name: "Operation A",//名称
 25                                      imageUrl: "https://pic.cnblogs.com/avatar/960222/20180926091801.png",//图片网址
 26                                      isTopOne: true)//是否为上方的图片
 27         
 28         //获得一个阻塞操作对象,设置该对象的参数
 29         let downloadB = getOperation(name: "Operation B",//名称
 30                                      imageUrl: "https://www.cnblogs.com/images/cnblogs_com/strengthen/1310229/o_wxin.jpg", //图片网址
 31                                      isTopOne: false)//是否为上方的图片
 32         
 33         //初始化一个操作队列对象
 34         let queue = OperationQueue()
 35         //设置在队列中,一次只执行一个任务
 36         queue.maxConcurrentOperationCount = 1
 37         //依次将两个阻塞操作对象添加到队列中
 38         queue.addOperation(downloadA)
 39         queue.addOperation(downloadB)
 40         
 41         //添加一个循环,用来遍历队列中的所有操作
 42         for operation in queue.operations
 43         {
 44             //在控制台依次输出两个阻塞操作对象的名称
 45             print("Operation's name:"+operation.name!)
 46         }
 47     }
 48     
 49     //添加一个方法,用来生成并返回阻塞操作对象
 50     func getOperation(name : String, imageUrl : String, isTopOne : Bool) -> BlockOperation
 51     {
 52         //初始化一个阻塞操作对象
 53         let download = BlockOperation(block:{_ in
 54             //将图片的路径字符串转换成网址对象
 55             let url = URL(string: imageUrl)
 56             //初始化一个二进制数据对象,用来下载从网络下载的图片的数据流
 57             var data : Data!
 58             //添加一个异常捕捉语句,执行图片的下载任务
 59             do
 60             {
 61                 //使线程暂停1.0秒钟,以方便观察任务的执行
 62                 Thread.sleep(forTimeInterval: 1.0)
 63                 
 64                 //通过二进制数字对象的,从网址获取内容的方法,下载网络图片。
 65                 //并将下载的数据存储在二进制数据对象中。
 66                 try data = Data(contentsOf: url!)
 67                 //然后将数据转换成图像内容
 68                 let image = UIImage(data: data)
 69                 
 70                 //判断需要使用哪个图像视图,来显示下载之后的图片内容。
 71                 if isTopOne
 72                 {
 73                     //在主线程上,使用位于上方的图像视图,显示下载的图片内容。
 74                     self.perform(#selector(ViewController.showTopImage), 
 75                                            on: Thread.main, 
 76                                            with: image, 
 77                                            waitUntilDone: true)
 78                 }
 79                 else
 80                 {
 81                      //在主线程上,使用位于下方的图像视图,显示下载的图片内容。
 82                     self.perform(#selector(ViewController.showFootImage), 
 83                                            on: Thread.main, 
 84                                            with: image, 
 85                                            waitUntilDone: true)
 86                 }
 87             }
 88             catch
 89             {
 90                 print("Error.")
 91             }
 92         })
 93         
 94         //设置阻塞操作对象的名称属性
 95         download.name = name
 96         //并返回设置好的对象
 97         return download
 98     }
 99     
100     //添加一个方法,用来设置位于上方的图像视图的内容
101     func showTopImage(image : UIImage)
102     {
103         self.topImageView.image = image
104     }
105     
106     //添加一个方法,用来设置位于下方的图像视图的内容
107     func showFootImage(image : UIImage)
108     {
109         self.footImageView.image = image
110     }
111     
112     override func didReceiveMemoryWarning()
113     {
114         super.didReceiveMemoryWarning()
115         // Dispose of any resources that can be recreated.
116     }
117 }
原文地址:https://www.cnblogs.com/strengthen/p/10222194.html