您的位置:首页 > 移动开发 > Swift

(swift) iOS线程一 ——Thread接口简单用法

2016-10-21 17:24 363 查看
swift学习:

一、线程(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!!")
}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift