(swift) iOS线程一 ——Thread接口简单用法
2016-10-21 17:24
363 查看
swift学习:
一、线程(Thread)接口简单用法
首先笔者一直在做安卓开发,只是一位ios的初学者,以下内容如有不正确之处,还望各位大牛们指出。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/d51f9fe57e5d35508c2e2c4fbb4c49b8)
在网上很多帖子里面,我有看到大家常使用的NSThread,可能因为我的XCode已经更新到了8.0,demo 默认的SDK版本为10.0,不幸的NSThread已经被Thread替代。
开发说明中可以看到,Thread提供了三个初始化方法:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/f31799f16694f0c78eebd7e0a7955a6a)
第二个初始化方参数说明:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/69ad4e9bc755e022fc94b6a3d6eab313)
target: selector消息发送到得对象
selector:这个对象向target发送消息。selector必须携带一个参数并且没有返回值。
argument:发个target的参数,可能是nil
(总感觉google的开发说明易懂)也许结合Object-C的广播调用机制来理解,selector是线程处理事务的方法,在Object-c中调用一个方法,会以广播形式把函数名,和参数传给对应对象。
var thread1: Thread?
thread1 = Thread(target: self, selector: “thread1ToDo”, object: nil)
我用老方式传入参数,运行报错了
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/74553ea9d8dbf03e0aa20c999a87fc2e)
我先按提示修改
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/577bd65cd92821858736a73f1c5d43c0)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/0364c05e0d3b1e076e2e653c70a0490f)
再修改
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/f0ddb9d2ba8b4681dab246a388438c03)
终于通过了,
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/c988e6079d213400df92e33539e32ebe)
下面来看第三个初始化函数:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/f445fcb65b3aa02237f907463761753e)
汗,没有说明!!但是看以上的定义格式可以知道,block是闭包。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/9c90c3365e9badb983972a4cb258b57b)
由XCode给出的一些版本判断看得出,该接口是iOS10.0加入的。若相兼容其他版本的的系统,使用该方式,显得有些繁琐。
关于第一个初始化方式,笔者没有在开发说明中找到set selector的函数,暂时不明白怎么把事务添加到线程实例中去运行。
除了直接创建线程实例,iOS还提供了使用线程的其他方式,API描述中:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/9431938d8cddbdf0af0bbb1e3aae2a35)
这里注意到detachNewThread开头的两个方法,从字面意思来理解这两个方法应该是直接启动一个新的线程处理对应的事务。这个两个函数的而参数与之前的初始化函数相似,可以参考以上说明。
使用实例:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/b97b91c8b4f930e16850fe5d82d76150)
线程控制:
开发说明文档Thread的概述是这样说的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/477f57bee9eb78db4ccfe3c7f76e874f)
大概的意思就是,Thread支持运行状态判断,你可以根据自己的需要在适当时候取消正在运行的线程结束它的任务。以下是状态读取接口:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/60ec4143c657b3931d761701b54987cb)
上面的函数根据命名就知道每个函数的功能了,就不多解释了,下面再来看线程控制函数:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/09d077df983c1c5ccf0f0711939e9c0c)
前三个为类函数,根据调用的位置决定,作用所在当前线程。
下面贴一些测试代码,实验一下接口
import UIKit
class ViewController: UIViewController {
var thread1: Thread?
var thread2: Thread?
}
此时运行结果:两条线程输出在时序上市随机的,下面做些调整使得两条线程有序的输出。
现在我们引入NSCondition这个类。还是先看看类的介绍说明
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/94aa357355984b324f010fe970e159f8)
这个说明大概的意思是,这个类描述了一个条件变量,这个变量在线程中同时起着Lock和条件检查点的作用,lock功能保护代码运行逻辑并在条件满足时执行任务,而检查点,在线程运行时只有检查点判定为真时才继续执行任务,否则线程阻塞在此,直到在其他线程被唤醒。相关流程开发文当中也有说明
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/17/f2a80d6fcaee25d7bbd2878daf3d24dd)
以下调整以下上面的代码:
import UIKit
class ViewController: UIViewController {
var con1 = NSCondition()
var con2 = NSCondition()
}
一、线程(Thread)接口简单用法
首先笔者一直在做安卓开发,只是一位ios的初学者,以下内容如有不正确之处,还望各位大牛们指出。
在网上很多帖子里面,我有看到大家常使用的NSThread,可能因为我的XCode已经更新到了8.0,demo 默认的SDK版本为10.0,不幸的NSThread已经被Thread替代。
开发说明中可以看到,Thread提供了三个初始化方法:
第二个初始化方参数说明:
target: selector消息发送到得对象
selector:这个对象向target发送消息。selector必须携带一个参数并且没有返回值。
argument:发个target的参数,可能是nil
(总感觉google的开发说明易懂)也许结合Object-C的广播调用机制来理解,selector是线程处理事务的方法,在Object-c中调用一个方法,会以广播形式把函数名,和参数传给对应对象。
var thread1: Thread?
thread1 = Thread(target: self, selector: “thread1ToDo”, object: nil)
我用老方式传入参数,运行报错了
我先按提示修改
再修改
终于通过了,
下面来看第三个初始化函数:
汗,没有说明!!但是看以上的定义格式可以知道,block是闭包。
由XCode给出的一些版本判断看得出,该接口是iOS10.0加入的。若相兼容其他版本的的系统,使用该方式,显得有些繁琐。
关于第一个初始化方式,笔者没有在开发说明中找到set selector的函数,暂时不明白怎么把事务添加到线程实例中去运行。
除了直接创建线程实例,iOS还提供了使用线程的其他方式,API描述中:
这里注意到detachNewThread开头的两个方法,从字面意思来理解这两个方法应该是直接启动一个新的线程处理对应的事务。这个两个函数的而参数与之前的初始化函数相似,可以参考以上说明。
使用实例:
线程控制:
开发说明文档Thread的概述是这样说的:
大概的意思就是,Thread支持运行状态判断,你可以根据自己的需要在适当时候取消正在运行的线程结束它的任务。以下是状态读取接口:
上面的函数根据命名就知道每个函数的功能了,就不多解释了,下面再来看线程控制函数:
前三个为类函数,根据调用的位置决定,作用所在当前线程。
下面贴一些测试代码,实验一下接口
import UIKit
class ViewController: UIViewController {
var thread1: Thread?
var thread2: Thread?
override func viewDidLoad() { super.viewDidLoad() thread1 = Thread(target: self, selector: #selector(ViewController.thread1ToDo), object: nil) thread2 = Thread(target: self, selector: #selector(ViewController.thread2ToDo), object: nil) thread1?.start() thread2?.start() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @objc func thread1ToDo() { for i in 1...30 { if i % 3 == 0 { Thread.sleep(forTimeInterval: 1) } print("I'm thread1 -- \(i)") } } @objc func thread2ToDo(sender: AnyObject?) { for i in 1...30 { if i % 3 == 0 { Thread.sleep(forTimeInterval: 1) } print("I'm thread2 -- \(i)") } }
}
此时运行结果:两条线程输出在时序上市随机的,下面做些调整使得两条线程有序的输出。
现在我们引入NSCondition这个类。还是先看看类的介绍说明
这个说明大概的意思是,这个类描述了一个条件变量,这个变量在线程中同时起着Lock和条件检查点的作用,lock功能保护代码运行逻辑并在条件满足时执行任务,而检查点,在线程运行时只有检查点判定为真时才继续执行任务,否则线程阻塞在此,直到在其他线程被唤醒。相关流程开发文当中也有说明
以下调整以下上面的代码:
import UIKit
class ViewController: UIViewController {
var con1 = NSCondition()
var con2 = NSCondition()
var thread1: Thread? var thread2: Thread? override func viewDidLoad() { super.viewDidLoad() thread1 = Thread(target: self, selector: #selector(ViewController.thread1ToDo), object: nil) thread2 = Thread(target: self, selector: #selector(ViewController.thread2ToDo), object: nil) thread1?.start() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @objc func thread1ToDo() { for i in 1...30 { if i % 3 == 0 { if thread2!.isExecuting { con2.signal() } else { thread2?.start() } con1.lock() con1.wait() con1.unlock() } print("I'm thread1 -- \(i)") } print("I'm thread1 over!!") } @objc func thread2ToDo(sender: AnyObject?) { for i in 1...30 { if i % 3 == 0 { con1.signal() con2.lock() con2.wait() con2.unlock() } print("I'm thread2 -- \(i)") } print("I'm thread2 over!!") }
}
相关文章推荐
- iOS NSThread 的三种创建线程的方法 非常简单好用
- iOS多线程管理-Thread,NSOperation,GCD的简单用法
- c++的thread类(c++线程简单用法)
- moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)
- moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)
- moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)
- Thread线程的方法用法,有代码例子,简单易懂
- c++的thread类(c++线程简单用法)
- 启动线程的五种方式方法(通过继承Thread类或实现Runnable接口)
- 线程希望IOS开发(67)之简单的线程方法
- 多线程Thread与后台线程setDaemon,使用Runnable接口创建多线程
- 一起来学POSIX thread 之 线程的创建和基本操作接口
- ios中block简单用法
- 在java编程时,线程创建实现Runnable接口与继承Thread类的不同
- java线程的简单例子(Thread and runnable)
- Java对多线程的支持(一) - Thread类、Runnable接口、Daemon线程、线程同步
- java多线程学习1-继承Thread类和实现Runnable接口来创建线程
- 线程(Thread类,Runnable接口)
- Java对多线程的支持(一) - Thread类、Runnable接口、Daemon线程、线程同步
- java--ThreadPool线程池简单用法