简介
NSOperationQueue(操作队列)是由GCD提供的队列模型的Cocoa抽象,是一套Objective-C的API
GCD提供了更加底层的控制,而操作队列则在GCD之上实现了一些方便的功能,这些功能对于开发者而言通常是最好最安全的选择
队列种类
NSOperationQueue有两种不同类型的队列:主队列和自定义队列
主队列运行在主线程上
自定义队列在后台执行,自动的创建子线程
操作种类
队列处理的任务是NSOperation的子类NSInvocationOperation和NSBlockOperation
基本使用步骤
1.定义操作队列
确定是 主队列 还是 自定义队列
2.定义操作
确定是NSInvocationOperation操作还是NSBlockOperation操作
3.将操作添加到队列
运行
注意:一旦将操作添加到队列,操作就会立即被调度执行
示例代码
<span style="font-size:24px;">#pragma mark -
#pragma mark NSBlockOperation
- (void)demo1
{
// //确定操作类型
// NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
//将操作添加到操作队列
//所有的自定义的队列,都在子线程上运行
//设置最大的并发个数.注意,在设定同时并发的最大线程个数时,如果前一个线程工作完成,但是还没有销毁,就会创建新的线程.在网络开发中需要根据用户当前的网络状况设定下载时,最大的并发操作个数(这一点GCD不好做到)
[self.myQueue setMaxConcurrentOperationCount:3];
for (int i=0; i<10; i++) {
[self.myQueue addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
}
// 在主线程上执行
// [[NSOperationQueue mainQueue] addOperationWithBlock:^{
// NSLog(@"%@",[NSThread currentThread]);
// }];
}
//NSInvocationOperation
- (void)demo2
{
//需要定义一个方法 不够灵活
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(haha) object:@"hello"];
// [self.myQueue addOperation:invocationOperation];
[[NSOperationQueue mainQueue] addOperation:invocationOperation];
}
- (void)haha
{
NSLog(@"%@",[NSThread currentThread]);
}
#pragma mark -
#pragma mark 设置任务的执行顺序
- (void)demo3
{
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片 %@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"UI更新图片 %@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"保存图片 %@",[NSThread currentThread]);
}];
//为了顺序执行,需要设定操作之间的依赖关系,注意,依赖关系是跨队列的.(这一点牛B)
[op2 addDependency:op1];
[op3 addDependency:op2];
</span><p><span style="font-size:14px;">// [op2 <span style="font-family: Arial, Helvetica, sans-serif;">addDependency:op1]</span><span style="font-family: Arial, Helvetica, sans-serif;">;循环引用,程序会崩溃</span></span></p><span style="font-size:24px;">
//执行时 会开启多个队列,在GCD串行队列中,只会开启一个线程
[self.myQueue addOperation:op1];
//在主线程跟新UI
[[NSOperationQueue mainQueue] addOperation:op2];
[self.myQueue addOperation:op3];
}
</span>