1. 程式人生 > >[Swift通天遁地]四、網絡和線程-(2)通過BlockOperation實現線程的隊列

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

resources ati tar 顯示 數據存儲 cgrect cnblogs try color

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

在項目導航區,打開視圖控制器的代碼文件【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, 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 }

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