[Swift通天遁地]4、網絡和線程-(2)經過BlockOperation實現線程的隊列

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-grrnecoo-ku.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

目錄:[Swift]通天遁地Swiftgit

本文將演示線程隊列的使用,使用線程隊列能夠依次執行一系列的任務。github

在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】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, width: 320, height: 280))
 15         //而後將該圖像視圖添加到根視圖中
 16         self.view.addSubview(topImageView)
 17         
 18         //初始化一個圖像視圖,並設置它的顯示區域
 19         footImageView = UIImageView(frame: CGRect(x: 0, y: 280, width: 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 }
相關文章
相關標籤/搜索