iOS开发Swift篇(02) NSThread线程相关简单说明

简介: iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明   1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明。   2)该文仅仅简单讲解NSThread在swift语境中的一些使用和注意点,别他。

iOS开发Swift篇(02) NSThread线程相关简单说明

一 说明

  1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明。

  2)该文仅仅简单讲解NSThread在swift语境中的一些使用和注意点,别他。

  3)本文涉及代码可以从https://github.com/HanGangAndHanMeimei/Code地址获得。

二 NSThread的基本使用和创建

  1)基本用法(主线程|当前线程)

 1        //1.获得执行该方法的当前线程
 2         let currentThread = NSThread.currentThread()
 3         print("当前线程为\(currentThread)")
 4 
 5         //2.获得应用程序的主线程
 6         let mainThread = NSThread.mainThread()
 7         print("应用程序的主线程\(mainThread)")
 8 
 9         //3.判断当前线程是否是主线程
10         let isMain =  NSThread.isMainThread() 

  2)创建线程

  说明:此处列出创建线程的四种方法:分别是

  直接创建|分离出一条子线程|创建一条后台线程|自定义线程类继承自NSThread重写内部的main方法封装任务,然后init创建。

 1 //NSThread创建线程的四种方式
 2     func createNewThreadWithNSThreadMethodOne()
 3     {
 4         //1.创建线程
 5         let thread = NSThread.init(target: self, selector:Selector("run"), object: nil)
 6 
 7         //设置线程的名称
 8         thread.name = "线程A"
 9 
10         //2.启动线程
11         thread.start()
12     }
13 
14     func createNewThreadWithNSThreadMethodTwo()
15     {
16         //分离出一条子线程,自动启动线程,但无法获得线程对象
17         NSThread.detachNewThreadSelector(Selector("run"), toTarget: self, withObject: nil)
18     }
19 
20     func createNewThreadWithNSThreadMethodThree()
21     {
22         //开启一条后台线程,自动启动线程,但无法获得线程对象
23         self.performSelectorInBackground(Selector("run"), withObject: nil);
24     }
25 
26     func createNewThreadWithNSThreadMethodFour()
27     {
28         //let thread =  CustomThread.init(target: self, selector:Selector("run"), object: nil)
29         let thread = CustomThread();
30         thread.start()
31     }
32 
33     func run()
34     {
35         //获得当前执行run方法的线程
36         let thread = NSThread.currentThread()
37         print("run--\(thread.name)-\(thread)");
38    }

三 NSThread线程的状态和线程安全

  1)线程的状态

    线程的状态:新建-就绪-运行-阻塞-死亡

1      //线程的退出
2         NSThread.exit()
3         //线程的休眠1
4         NSThread.sleepForTimeInterval(2.0)
5         //线程的休眠2
6         NSThread.sleepUntilDate(NSDate.init(timeIntervalSinceNow: 3.0))

  2)线程安全

    说明:多线程访问同一个资源的时候可能会出现数据错乱等安全问题,解决方法是对必要的代码段进行加锁。

    注意:在OC中加互斥锁使用@synchronized(self) {},在swift可以使用objc_sync_enter(self)和objc_sync_exit(self)方法,注意这两个方法必须成对使用,把要加锁的代码放在中间

 1 class ViewController: UIViewController {
 2 
 3     //设置总票数为100张
 4     var totalTickets = 100
 5 
 6     override func viewDidLoad() {
 7         super.viewDidLoad()
 8 
 9         //多线程访问资源加锁
10         //创建三条线程分别代表售票员A、售票员B、售票员C
11         let thread01 = NSThread.init(target: self, selector:Selector("saleTickect"), object: nil)
12         let thread02 = NSThread.init(target: self, selector: Selector("saleTickect"), object: nil);
13         let thread03 = NSThread.init(target: self, selector: Selector("saleTickect"), object: nil);
14 
15         //设置线程的名称
16         thread01.name = "售票员A"
17         thread02.name = "售票员B"
18         thread03.name = "售票员C"
19 
20         //开启线程
21         thread01.start()
22         thread02.start()
23         thread03.start()
24 
25     }
26 
27     //模拟售票的函数
28     func saleTickect()
29     {
30         while(true)
31         {
32             //加互斥锁
33             /*
34             * 1)同OC中的@synchronized(self) {}
35             * 2)objc_sync_enter(self)和objc_sync_exit(self)必须成对使用,把要加锁的代码放在中间
36             */
37 
38             objc_sync_enter(self)
39 
40             //检查是否有余票,如果有则卖出去一张
41             let temp = totalTickets
42             for var i=0;i<100000;i++
43             {
44                 //空的for循环,模拟延迟
45             }
46 
47             if(temp>0)
48             {
49                 totalTickets = temp - 1
50                 print("\(NSThread.currentThread().name)卖出去了一张票,还剩\(totalTickets)")
51             }else
52             {
53                 print("\(NSThread.currentThread().name)发现票已经卖完了")
54                 break;
55             }
56             
57             objc_sync_exit(self)
58         }
59         
60     }
61     
62 }
线程安全Code示例

三 NSThread线程间通信

  1)说明

    所谓线程间通信,即如何从一个线程进入到另一个线程继续执行任务或者是传递参数(如从子线程回到主线程)

    下面的代码示例演示在主线程中先创建一个子线程下载图片,当图片下载完成后又切换到主线程设置图片的操作。

 1 //!!!注意,该案例内部下载图片,发送了http请求需要修改info.plist文件
 2     class ViewController: UIViewController {
 3 
 4     @IBOutlet weak var imageView: UIImageView!
 5 
 6     override func viewDidLoad() {
 7         super.viewDidLoad()
 8 
 9         //程序启动后开子线程下载图片,图片下载完成之后回到主线程设置图片
10          NSThread.detachNewThreadSelector(Selector("downloadImage"), toTarget: self, withObject: nil)
11     }
12 
13     func downloadImage()
14     {
15         //1.获得要下载图片的url
16         let url = NSURL.init(string: "http://p9.qhimg.com/t014d1bd470cb60ac6e.jpg")
17 
18         //2.把url地址指向资源的二进制下载到本地
19         let imageData = NSData.init(contentsOfURL: url!)
20 
21         //3.把二进制数据转换为图片
22         let image = UIImage.init(data: imageData!);
23 
24         //4.打印查看当前线程(应该是在子线程中下载图片)
25         print("当前线程为\(NSThread.currentThread())")
26 
27         //5.线程间通信
28         //方法一
29         self.performSelectorOnMainThread(Selector("showImage:"), withObject: image, waitUntilDone:true)
30         //方法二
31         //imageView.performSelectorOnMainThread(Selector("setImage:"), withObject: image, waitUntilDone:true)
32     }
33 
34     
35     func showImage(image:UIImage)
36     {
37         //设置图片
38         imageView.image = image
39 
40         //打印查看设置图片操作的线程
41         print("处理UI刷新操作的线程\(NSThread.currentThread())")
42 
43     }
44 }
线程间通信示例Code

 

目录
相关文章
|
22天前
|
机器学习/深度学习 TensorFlow Swift
Swift语言适合多个领域的开发
Swift语言适合多个领域的开发
50 9
|
22天前
|
安全 编译器 Swift
Swift开发
Swift开发
38 9
|
8天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
24天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
43 9
|
1月前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
2月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
3月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
46 4
|
2月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
30 0
|
3月前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
51 1
C++ 多线程之初识多线程