★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10222194.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
本文将演示线程队列的使用,使用线程队列可以依次执行一系列的任务。
在项目导航区,打开视图控制器的代码文件【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 }