ios开发学习笔记——多进程编程之NSThread/GCD


官网文档:NSThreadClass Reference

GCD class Reference

一、     基本知识

1、        一个程序会产生一个主线程(MainThread),主线程专门处理UIKit对象的操作

2、        耗时的操作放在其他线程,放在后台处理。

3、        为了线程安全(Thread-safe),当线程对某个对象操作时,会使用”锁”机制,即会对操作的对象上锁,其他线程不能访问该对象,

4、        在OC语言编写的程序中,当给一个自定义类中添加属性的时候,属性关键字其中就有:atomic和nonatomic的区分,其中:atomic是线程安全的,当有线程访问这个属性时,会为该属性的setter方法加锁,atomic是默认值。但是,我们在实际的开发中,都会把给属性设置nonatomic关键字,因为对于移动设备来说,效率更加重要,但也需要程序员注意线程安全问题

二、     NSThread

官网文档:NSThreadClass Reference

文档介绍怎么初始化,开始,结束,等

可以用来获取线程类的属性

由于生命周期需要手动管理,有更好的代替,见下文

三、     GCD(GrandCentral Dispatch)

1、        自己管理生命周期,使用的是C语言,我们只需要使用它去做什么,在Swift中使用Block(闭包)

2、        是苹果公司为多核并行运算自动合理利用CPU提出的解决问题

3、        任务/操作:一段闭包代码,有两种执行方式:

同步执行:会阻塞当前线程并等待Block中的任务执行完毕,之后当前线程才继续往下运行。

异步执行:当前线程直接往下执行,它不会阻碍当前线程。

相关函数

dispatch_async(dispatch_queue_t queue,dispatch_block_t block);//异步任务

dispatch_sync(dispatch_queue_t queue,dispatch_block_t block);//同步任务

 

4、      队列:用于存放任务

串行队列:放到串行队列的任务,GCD 会 FIFO(先进先出) 地取出来一个,执行一个,然后取下一个,这样一个一个的执行

并行队列:放在并行队列中的任务,GCD会按FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行

            创建队列函数:

            dispatch_get_main_queue(void);//获取主队列

            //创建串行队列

  letqueue = dispatch_queue_create("tk.bourne.testQueue", nil);

  letqueue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_SERIAL)serial:串行的】

  //创建并行队列

  letqueue = dispatch_queue_create("tk.bourne.testQueue", DISPATCH_QUEUE_CONCURRENT)concurrent:并发的】

let queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)//全局并行队列(一般并行任务都加入这个队列)

 第一个参数表示唯一标识队列的参考符,可以为nil.第二个参数表示创建队列类型(DISPATCH_QUEUE_SERIAL/串行  DISPATCH_QUEUE_CONCURRENT/并行)

总结见下表:

ios开发学习笔记——多进程编程之NSThread/GCD_第1张图片

队列组         

将很多队列添加到一个组里,当组内所有的任务都完成,才会使用一个方法通知我们

//1.创建队列组

dispatch_group_t group =dispatch_group_create();

//执行任务,只有异步方法

dispatch_group_async(groupName,queue){block}|

//4.都完成后会自动通知

dispatch_group_notify(group,dispatch_get_main_queue()) { () -> Void in

   }

提示:可以使用NSLog(NSThread.currentThread())打印进程信息

5、        队列创建等见简书--关于ios线程,你看我就够了

6、        线程间通信(通过嵌入子任务实现)

在涉及网络数据获取的过程中,一般会使用异步任务+并发队列进行数据获取,当获取到网络服务器返回的数据后,需要在主线程中把数据显示在屏幕上,因此这就涉及到线程间的通信。在并行队列中的任务中,还可以嵌套子任务,嵌套的子任务可以设置为在主/其他线程中执行的任务(实例参考宏创学院»GCD使用介绍:2-线程间通信 »GCD使用介绍:3-队列组dispatch group

现在的进程进程管理使用的是NSOperation及子类,看下一篇博客

详细学习讲解参考:简书--关于ios线程,你看我就够了

你可能感兴趣的:(swift,ios开发)