NSOperation的多线程
NSOperation基于GCD的封装,使用的步骤和GCD相似,①创建队列 ②封装操作任务。
NSOperation有两种队列:
主队列:
NSOperationQueue *queue = [NSOperationQueue mainQueue];
自定义队列(就是并发队列):
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
使用的第二步:封装操作任务
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(run) object:nil];
第三步: 将任务添加到队列中
[queue addOperation:op1];// 这一步内部会自动调动 [op1 start],将任务开始。
代码示例:
-(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];
}
封装操作任务的第二种方法:
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"run----%@",[NSThread currentThread]);
}];
NSBlockOperation的代码示例:
-(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]);
}];
[op1 addExecutionBlock:^{
NSLog(@"这是追加的任务");
}];
//设置最大并发数
queue.maxConcurrentOperationCount = 1;
//将任务添加到队列
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
}
注意:设置最大并发数 并不能决定开几条线程,只能决定任务的执行顺序。 最大并发数不能控制追加任务的执行顺序。
设置队列暂停
[self.queue setSuspended:YES]; 设置暂停 不能立即停止正在执行的任务, 只能停止正在执行操作后面的操作。当前任务不可分割,必须执行完毕。
恢复队列
[self.queue setSuspended:NO];
取消所有的操作
[self.queue cancelAllOperations]; 只能取消队列中处于等待状态的操作,正在执行的操作不会取消。