一、多线程实现:
NSOperation和NSOperationQueue实现多线程的具体步骤:
(1)先将需要执行的操作封装到一个NSOperation对象中
(2)然后将NSOperation对象添加到NSOperationQueue中
(3)系统会⾃动将NSOperationQueue中的NSOperation取出来
(4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏
二、NSOperation的子类
NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类
使用NSOperation⼦类的方式有3种:
(1)NSInvocationOperation
需要传入一个方法名。
//1.创建NSInvocationOperation对象
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
//2.开始执行
[operation start];
通过调用start方法来执行任务,默认是同步执行的。只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作 。
(2)NSBlockOperation
需要传递一个Block实现。
//1.创建NSBlockOperation对象
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
//......
}];
//2.开始任务
operation.start()
通过调用start方法来执行任务,默认是同步执行的。
但是 NSBlockOperation 还有一个方法:addExecutionBlock: ,通过这个方法可以给 Operation 添加多个执行 Block。
这样 Operation 中的任务 会并发执行,它会 在主线程和其它的多个线程 执行这些任务。
即:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作。但是会在 当前线程和其他线程 中执行,也就是说还是会占用当前线程。
如下:
//添加操作2
[operation addExecutionBlock:^{
//....
}];
//添加操作3
[operation addExecutionBlock:^{
//....
}];
(3)自定义子类继承NSOperation,实现内部相应的⽅法
三、NSOperationQueue队列
添加操作到NSOperationQueue中,自动执行操作,自动开启线程
1、主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
2、其他队列
其他队列的任务会在其他线程并行执行。
//1.创建一个其他队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//2.创建NSBlockOperation对象
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@", [NSThread currentThread]);
}];
//3.添加多个Block
for (NSInteger i = 0; i < 5; i++) {
[operation addExecutionBlock:^{
NSLog(@"第%ld次:%@", i, [NSThread currentThread]);
}];
}
//4.队列添加任务
[queue addOperation:operation];
四、提供的方法
1、线程数
NSOperationQueue
有一个参数 maxConcurrentOperationCount
最大并发数,用来设置最多可以让多少个任务同时执行。当你把它设置为 1
的时候,他不就是串行了。
2、队列直接添加操作
- [queue addOperationWithBlock:^() {
- NSLog(@"执行一个新的操作,线程:%@", [NSThread currentThread]);
- }];
3、设置依赖关系
- NSOperationQueue *queue = [[NSOperationQueue alloc] init];
- NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){
- NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);
- }];
- NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){
- NSLog(@"执行第2次操作,线程:%@", [NSThread currentThread]);
- }];
- // operation1依赖于operation2
- [operation1 addDependency:operation2];
- [queue addOperation:operation1];
- [queue addOperation:operation2];
因此完全可以在不同的queue之间的NSOperation对象创建依赖关系。
4、优先级
可以通过setQueuePriority:方法来提升或降低operation对象的优先级。优先级只能应用于相同queue中的operations。
5、取消操作
- // 取消单个操作
- [operation cancel];
- // 取消queue中所有的操作
- [queue cancelAllOperations];
6、暂停和继续queue
- // 暂停queue
- [queue setSuspended:YES];
- // 继续queue
- [queue setSuspended:NO];
7、void (^completionBlock)(void); //用来设置完成后需要执行的操作