李洪强iOS开发Swift篇---12_NSThread线程相关简单说明
李洪强iOS开发Swift篇---12_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)方法,注意这两个方法必须成对使用,把要加锁的代码放在中间
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
三 NSThread线程间通信
1)说明
所谓线程间通信,即如何从一个线程进入到另一个线程继续执行任务或者是传递参数(如从子线程回到主线程)
下面的代码示例演示在主线程中先创建一个子线程下载图片,当图片下载完成后又切换到主线程设置图片的操作。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)