多线程之NSOperationQueue(线程队列)
NSOperationQueue的使用
OperationQueue 相比 GCD的优势:
- 1.可以设置依赖关系
- 2.队列可以暂停
- 3.可以取消队列中的操作
NSOpertionQueue NSOperation
Queue
主队列 和 自定义队列
主队列是运行在主线程当中,自定义队列运行在后台
NSOperation 定义需要执行的操作(任务)
定义需要的操作,然后把该操作添加到合适的队列中
- 1.创建队列对象
- 2.创建操作对象
- 3.把操作对象添加到队列之中,等待队列分配线程执行操作
1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//最大并发操作数
//队列中最多有几个操作同时执行
queue.maxConcurrentOperationCount = 1;
//暂停执行队列中的线程
// [queue setSuspended:YES];
2.创建操作
//NSOperation 不能直接使用
//使用子类的对象
// NSOperation *operation = [[NSOperation alloc] init];
NSOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(thread1:)
object:@"op1 "];
NSOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(thread2:)
object:@"op2 "];
NSBlockOperation *op3 = [[NSBlockOperation alloc] init];
[op3 addExecutionBlock:^{
for (int i = 0; i < 10; i++) {
NSLog(@"OP1 ----- %d", i);
sleep(1);
}
}];
NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 10; i++) {
NSLog(@"OP4 ------------ %d", i);
sleep(1);
}
}];
3.把操作加入到队列中
//加入之后,如果有操作,那队列就会自动执行
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue addOperation:op4];
4.设置操作的优先级
[op1 setQueuePriority:NSOperationQueuePriorityLow];
[op2 setQueuePriority:NSOperationQueuePriorityNormal];
[op3 setQueuePriority:NSOperationQueuePriorityHigh];
[op4 setQueuePriority:NSOperationQueuePriorityVeryHigh];
5.设置操作之间的依赖关系
- (1)加入队列中时间
- (2)优先级
- (3)依赖关系 (明确指定操作的执行顺序)
[op2 addDependency:op1]; //op2的执行依赖于op1,保证op1肯定op2之前执行
//重新让队列执行
[queue setSuspended:NO];
6.取消所有的操作 不能取消正在执行的操作
sleep(3);
[queue cancelAllOperations];
//取消一个操作
[op3 cancel];
6.与此同时主线程也在运行:
for (int i = 0; i < 50; i ++)
{
NSLog(@"主线程 : %d", i);
}
- (void)thread1:(NSString *)name
{
//具体要执行的操作
for (int i = 0; i < 50; i ++) {
NSLog(@"多线程 %@: %d", name, i);
}
}
- (void)thread2:(NSString *)name
{
for (int i = 0; i < 50; i ++) {
NSLog(@"多线程 %@: %d", name, i);
}
}
@end
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。