本文主要总结前面讲到的iOS开发中多线程实现的三个方案。
NSThread:
1. NSThread适合轻量级多线程开发
2. 控制线程顺序比较难,同时线程总数无法控制(每次创建并不能重用之前的线程,只能创建一个新的线程)。
3. 需要程序员手动管理线程的生命周期,线程同步(线程同步对数据加锁会有一定的系统开销)。
1> 开线程的几种方式
* 先创建,后启动
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];
[thread start];
* 直接启动
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
或者
[self performSelectorInBackground:@selector(run) withObject:nil];
2> 其他用法
NSThread *current = [NSThreadcurrentThread];
+ (NSThread *)mainThread; // 获得主线程
3> 线程间通信
[self performSelectorOnMainThread:@selector(testRun) withObject:self waitUntilDone:NO];// 等等
GCD:(Grand CentralDispatch)
1. GCD是苹果公司为多核的并行运算提出的解决方案
2. GCD会自动利用更多的CPU内核(比如双核、四核)
3. GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4. 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
1> 队列的类型
* 并发队列
获得全局的并发队列:dispatch_get_global_queue
* 串行队列
a.自己创建
dispatch_queue_create
b.主队列
dispatch_get_main_queue
2> 执行任务的方法类型
* 同步(sync)执行
* 异步(async)执行
3> 了解队列和方法的配合使用
4> 线程间通信
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
//执行耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执行UI刷新操作
});
});
5> 其他用法
dispatch_once
dispatch_after
dispatch_group_async\dispatch_group_notify
NSOperation:
1. 基于GCD的多线程实现方案,拥有GCD的优点
2. 比GCD多了一些使用的功能(自定义NSOperation)
1> 基本使用
NSInvocationOperation
NSBlockOperation
2> NSOperationQueue(重点)
* 最大并发数设置
-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;
* 设置依赖
[operationB addDependency:operationA]; // 操作B依赖于操作A
3> 自定义Operation(了解基本流程)