NSOperation基于GCD的封装,使用的步骤和GCD相似,①创建队列 ②封装操作任务。
NSOperation有两种队列:
主队列:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #703daa }
NSOperationQueue *queue = [NSOperationQueue mainQueue];
自定义队列(就是并发队列):
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
使用的第二步:封装操作任务
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
span.s3 { color: #ba2da2 }
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];
第三步: 将任务添加到队列中
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #3e1e81 }
[queue addOperation:op1];// 这一步内部会自动调动 [op1 start],将任务开始。
代码示例:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #ffffff; min-height: 14.0px }
span.s1 { color: #ba2da2 }
span.s2 { color: #000000 }
span.s3 { color: #3e1e81 }
-(void)invocationWithQueue
{
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//封装操作
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];
NSInvocationOperation *op3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];
//将任务添加到队列
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
}
封装操作任务的第二种方法:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
span.s3 { color: #ba2da2 }
span.s4 { color: #31595d }
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #d12f1b }
span.s3 { color: #703daa }
NSLog(@"run----%@",[NSThread currentThread]);
}];
NSBlockOperation的代码示例:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #ba2da2 }
span.s2 { color: #000000 }
span.s3 { color: #3e1e81 }
span.s4 { color: #31595d }
-(void)invocationBlockWithQueue
{
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//封装操作
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1----%@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2----%@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3----%@",[NSThread currentThread]);
}];
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #3e1e81 }
span.s3 { color: #d12f1b }
[op1 addExecutionBlock:^{
NSLog(@"这是追加的任务");
}];
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #008400; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #272ad8 }
//设置最大并发数
queue.maxConcurrentOperationCount = 1;
//将任务添加到队列
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
}
注意:设置最大并发数 并不能决定开几条线程,只能决定任务的执行顺序。 最大并发数不能控制追加任务的执行顺序。
设置队列暂停
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #4f8187 }
[self.queue setSuspended:YES]; 设置暂停 不能立即停止正在执行的任务, 只能停止正在执行操作后面的操作。当前任务不可分割,必须执行完毕。
恢复队列
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #4f8187 }
[self.queue setSuspended:NO];
取消所有的操作
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #4f8187 }
[self.queue cancelAllOperations]; 只能取消队列中处于等待状态的操作,正在执行的操作不会取消。
原文地址:https://www.cnblogs.com/dashengios/p/10420800.html