[Xcode10 实际操作]八、网络与多线程-(19)使用RunLoop使PerformSelector方法延迟动作的执行

本文将演示使用RunLoop使PerformSelector方法延迟动作的执行。

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

 1 import UIKit
 2 
 3 class ViewController: UIViewController {
 4 
 5     //添加一个布尔属性,用来标识加载状态
 6     var stillLoading = true
 7     
 8     override func viewDidLoad() {
 9         super.viewDidLoad()
10         // Do any additional setup after loading the view, typically from a nib.
11         
12         //创建一个位置在(100,100),尺寸为(100,30)的显示区域。
13         let rect = CGRect(x: 100, y: 100, width: 100, height: 30)
14         //初始化一个标签对象,设置标签对象的位置和尺寸信息
15         let label = UILabel(frame: rect)
16         //设置标签对象的显示内容
17         label.text = "Waiting"
18         //给标签对象设置标识值,一边将来通过标识值,来调用标签对象。
19         label.tag = 1
20         //将标签对象,添加到当前视图控制器的根视图
21         self.view.addSubview(label)
22         
23         //执行一个方法,并设置延迟执行为0秒,即立即执行该方法
24         self.perform(#selector(ViewController.threadEvent), with: nil, afterDelay: 0.0)
25     }
26     
27     //添加一个方法,用来响应定时事件
28     @objc func threadEvent()
29     {
30         //执行一个方法,并设置延迟执行为2秒,即等待2秒后,执行该方法
31         self.perform(#selector(ViewController.workInBackground), with: nil, afterDelay: 2.0)
32         
33         //添加一条while语句,这条语句将使方法一直处于执行状态,
34         while stillLoading
35         {
36             //直到布尔变量值为假,才会跳出当前循环,以此实现线程等待阻塞
37             RunLoop.current.run(mode:.default, before: Date.distantFuture)
38         }
39         
40         //当程序跳出当前的循环语句时,隐藏标签对象
41         self.view.viewWithTag(1)?.isHidden = true
42     }
43     
44     //添加一个方法,用来响应定时事件
45     @objc func workInBackground()
46     {
47         //将变量的值设为否,以清除线程的阻塞
48         print(">>>>>>>>>>>>>>>>>>>")
49         stillLoading = false
50     }
51 
52     override func didReceiveMemoryWarning() {
53         super.didReceiveMemoryWarning()
54         // Dispose of any resources that can be recreated.
55     }
56 }

猜你喜欢

转载自www.cnblogs.com/strengthen/p/10069012.html