zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    正则表达式
    Ajax跨域问题---jsonp
    Ajax
    字符串总结
    js 字符串加密
    jsDate()
    HDU 5430 Reflect
    HDU 5429 Geometric Progression
    HDU 5428 The Factor
    POJ 2485 Highways
  • 原文地址:https://www.cnblogs.com/strengthen/p/10222194.html
Copyright © 2011-2022 走看看