NSOperation 和 NSOperationQueue 实现多线程的步骤
- 先将需要执行的操作封装到一个NSOperationQueue对象中
- 将NSOperation对象添加到NSOperationQueue中
- 系统会自动将NSOperationQueue中的NSOperation取出来
- 将取出来的NSOperation封装的操作放到一条线程中去执行
NSOperation的使用
- NSOperation 是个抽象类, 并不具备封装操作的能力, 必须使用它的子类
- 使用NSOperation子类的方式
1. NSInvocationOperation
2. NSBlockOperation
3. 自定义子类继承自NSOperation, 实现内部相应的方法(重写main方法)
NSOperationQueue 的作用
将NSOperation添加到NSOperationQueue中,系统就会异步执行NSOperation的操作
代码演示
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 1.NSInvocationOperation 创建任务
NSInvocationOperation *invocationOperation1 = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(operation1)
object:nil];
NSInvocationOperation *invocationOperation2 = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(operation2)
object:nil];
// 将操作放置于队列中
[queue addOperation:invocationOperation1];
[queue addOperation:invocationOperation2];
// 2.NSBlockOperation 创建任务
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---3--- %@", [NSThread currentThread]);
}];
[blockOperation addExecutionBlock:^{
NSLog(@"---4--- %@", [NSThread currentThread]);
}];
// 将操作放置于队列中
[queue addOperation:blockOperation];
// 3.NSOperationQueue 创建Block任务
[queue addOperationWithBlock:^{
NSLog(@"---5--- %@", [NSThread currentThread]);
}];
线程通信
[[[NSOperationQueue alloc] init] addOperationWithBlock:^{
// 耗时任务
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 主线程 刷新UI
}];
}];
任务依赖
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建任务1
NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 5; i++) {
NSLog(@"---1--- %@", [NSThread currentThread]);
}
}];
// 创建任务2
NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 5; i++) {
NSLog(@"---2--- %@", [NSThread currentThread]);
}
}];
// 创建任务3
NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---3--- %@", [NSThread currentThread]);
}];
// 先执行后者,再执行前者 任务之间不能相互依赖
[blockOperation1 addDependency:blockOperation2];
// 将操作放置于队列中
[queue addOperation:blockOperation1];
[queue addOperation:blockOperation2];
[queue addOperation:blockOperation3];