摘要:本文将带你了解IOS开发入门(swift) iOS线程一 ——Thread接口简单用法,希望本文对大家学IOS有所帮助。
本文将带你了解IOS开发入门(swift) iOS线程一 ——Thread接口简单用法,希望本文对大家学IOS有所帮助。
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!!")}
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号