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

 

目录
相关文章
|
11天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
11天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
32 0
|
12天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
12天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
20天前
|
iOS开发 开发者 UED
利用SwiftUI构建动态列表:iOS开发的新范式
【4月更文挑战第22天】在本文中,我们将深入探讨如何使用SwiftUI来创建动态列表。SwiftUI是苹果最新推出的用户界面工具集,它允许开发者以声明式的方式描述用户界面,从而简化了代码的复杂性。我们将通过具体的代码实例,展示如何利用SwiftUI的List和ForEach视图来创建动态列表,并讨论其在实际开发中的应用。
18 2
|
24天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
21 0
|
1月前
|
搜索推荐 iOS开发 开发者
利用SwiftUI构建动态用户界面:iOS开发新篇章
【4月更文挑战第10天】在移动应用的世界中,流畅的用户体验和引人注目的界面设计是至关重要的。随着SwiftUI的推出,iOS开发者被赋予了创造高度动态且响应式界面的能力。本文将深入探讨如何利用SwiftUI的强大特性来实现一个动态用户界面,包括其声明性语法、状态绑定以及视图更新机制。我们将通过一个天气应用案例,了解如何有效地运用这些工具来提升应用的交互性和视觉吸引力。
|
iOS开发 索引 Perl
iOS 开发创建CocoaPods公有库以及subspec分支功能(下)
iOS 开发创建CocoaPods公有库以及subspec分支功能
384 0
iOS 开发创建CocoaPods公有库以及subspec分支功能(下)
|
开发框架 开发工具 数据安全/隐私保护
iOS 开发创建CocoaPods公有库以及subspec分支功能(上)
iOS 开发创建CocoaPods公有库以及subspec分支功能
337 0
iOS 开发创建CocoaPods公有库以及subspec分支功能(上)
|
测试技术 网络架构 iOS开发
iOS开发中WiFi相关功能总结
1.Ping域名、Ping某IP 有时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作。这里的ping与传统的做get或者post请求还是有很大区别的。比如我们连接了某个WiFi,测试ping www.baidu.com,如果能ping 通,基本可以断定可以上网了,但是如果我们做了一个get 请求(url 是www.baidu.com),路由器可能重定
1870 0

热门文章

最新文章

相关课程

更多