第一: iOS的三种多线程技术
1.NSThread (线程)每个NSThread对象对应一个线程,量级较轻
2.NSOperation/NSOperationQueue 面向对象的线程技术
3.GCD —— Grand Central Dispatch 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术
以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。但是就目前而言,iOS的开发者,需要了解三种多线程技术的基本使用过程。因为很多框架技术分别使用了不同多线程技术。
第二:三种多线程技术的对比
•NSThread:
–优点:NSThread 比其他两个轻量级,使用简单
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
•NSOperation:
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
–NSOperation是面向对象的
•GCD:
–Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术
–GCD是基于C语言的

第三:三种线程的特点

1>.NSThread
•创建线程方法:
1.+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
2.- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;
•参数说明:
–selector:线程执行的方法,只能有一个参数,不能有返回值
–target:selector消息发送的对象
–argument:传输给target的唯一参数,也可以是nil
•detachNewThreadSelector方法会直接启动线程方法
•initWithTarget需要调用start方法才能够启动线程方法
2>.NSOperation & NSOperationQueue
•NSOperation的两个子类
1.NSInvocationOperation
2.NSBlockOperation
●
•工作原理:
1.用NSOperation封装要执行的操作
2.将创建好的NSOperation对象放NSOperationQueue中
3.启动OperationQueue开始新的线程执行队列中的操作
•注意事项:
1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢
2.使用以下方法可以控制并发的线程数量:
-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;
-1.不能直接使用NSOperation
-2.定义完操作后,将添加到操作队列中,即可启动异步操作,否则操作任务仍然在主线程中执行
-3.使用NSBlockOperation更加简单直接
-4.使用setMaxConcurrentOperationCount可以限制并发操作数量,降低系统开销
-5.使用addDependency可以建立操作之间的依赖关系,设定操作的执行顺序
3>.GCD
•GCD是基于C语言的框架
•工作原理:
–让程序平行排队的特定任务,根据可用的处理资源,安排它们在任何可用的处理器上执行任务
–要执行的任务可以是一个函数或者一个block
–底层是通过线程实现的,不过程序员可以不必关注实现的细节
–GCD中的FIFO队列称为dispatch queue,可以保证先进来的任务先得到执行
–dispatch_notify 可以实现监听一组任务是否完成,完成后得到通知
•GCD队列:
1.全局队列:所有添加到主队列中的任务都是并发执行的
2.串行队列:所有添加到串行队列中的任务都是顺序执行的
3.主队列:所有添加到主队列中的任务都是在主线程中执行的

 

第四点::重点分析

1.队列的2大类型
1> 并发队列:可以同时执行多个任务
  * 获取并发队列
  并发队列都是全局的:dispatch_get_global_queue(0, 0),不需要管理内存
2> 串行队列:同一时间内,只能执行一个任务
  * 获取串行队列
    (1) 跟主线程想关联的队列 dispatch_get_main_queue(),不需要管理内存
    (2) 手动创建队列,dispatch_queue_create("cn.itcast.queue", NULL),手动管理内存 dispatch_release(queue)
2.队列中任务的执行顺序:先进先出
3.开启任务
1> 开启同步任务
dispatch_sync(queue, ^{});
2> 开启异步任务
dispatch_async(queue, ^{});
4.迭代
dispatch_apply(10, queue, ^(size_t i) {});
5.总结:
1> 队列的类型只决定任务是并发还是串行执行,不影响同步还是异步
2> 决定同步还是异步,还要看函数名称,dispatch_async代表异步,dispatch_sync代表同步

 

 

第五点:琐碎收集

 

1.开启后台线程执行任务
 [self performSelectorInBackground:@selector(test) withObject:nil];
 2.GCD
 1> 队列类型
 * 全局队列
   * 所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)
   * dispatch_get_global_queue
 * 串行队列
   * 所有添加到串行队列中的任务都是按顺序执行(开一条线程) 
   * dispatch_queue_create("myqueue", 0);
 * 主队列
   * 所有添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)  
   * dispatch_get_main_queue
 2> 同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)
 * 同步:dispatch_sync,在当前线程执行任务,不会开启新的线程
 * 异步:dispatch_async,在其他线程执行任务,会开启新的线程
 3.NSOperation\NSOperationQueue
 1> 使用步骤
 * 创建NSOperation
 * 添加NSOperation到NSOperationQueue
 2> 优点
   * 更加面向对象
   * 可以控制最大并发数  maxConcurrentOperationCount
   * 添加任务(Operation)之间的依赖 addDependency