常用开启多线程的方法
- NSOperation 封装一下GCD的方法 提供OC的语法来使用GCD
- 2.GCD 官推 可以最大化的发挥多核CPU 是C语言的函数
- NSOperation 是一个抽象类
- NSBlockOperation
- NSInvocationOperation
线程队列
- 1.串行队列 主线程相当于一个串行队列 队列中的任务 需要一个执行完毕后 再执行下一个
2.并行队列 队列中的任务进行 并发执行 同时开始 未必同时结束
同步:没有开启子线程的能力
- 异步:拥有开启子线程的能力
- 任务是什么?
- 比如说 下载 打印 都是个任务
使用GCD 或者NSOperation 要做的就是 往合适的队列中添加任务 其他的系统会根据队列的类型 开启线程去完成任务
线程之间的通信
在子线程中 完成耗时的操作完成后需要回到主线程进行UI的刷新….tableView- 主线程 与 子线程是独立的 互不干扰
NSOperation
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
// 需要把NSInvocationOperation对象 放进一个队列里 才能完成开启子线程
// 创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 给队列 设置 最大并发数
queue.maxConcurrentOperationCount = 1;
// 开启一个线程(相当于 一个任务)
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@"12"];
// 把任务添加到 队列中
// 只需要把任务添加进队列中 不需要咱们来操作
// 会自动执行 不是添加一个任务就开启一个线程
// 这个操作是系统给咱们的 有的线程 会被系统重复利用(优化)
[queue addOperation:operation];
// 往队列中添加任务
[queue addOperationWithBlock:^{
// block中 就是你要添加任务
NSLog(@"%@",[NSThread currentThread]);
}];
// 开启一个线程
// [operation start];
// 初始化一个任务
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"任务------任务4-----%@",[NSThread currentThread]);
}];
// 添加进队列
[queue addOperation:blockOperation];
}
- (void)download:(NSString *)str{
NSLog(@"%@",[NSThread currentThread]);
}