「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
使用NSOperationQueue时,设置maxConcurrentOperationCount最大并发数,默认-1并行,1即为串行。
- addOperationWithBlock
NSLog(@"---begin");
//队列
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
//任务
[queue addOperationWithBlock:^{
[self test];
}];
[queue addOperationWithBlock:^{
[NSThread sleepForTimeInterval:2];
for (int i=3; i<6; i++) {
NSLog(@"---%d---%@",i,[NSThread currentThread]);
}
}];
NSLog(@"---end");
效果一样,使用方法不一样而已。
- 添加依赖和监听addDependency,completionBlock
NSLog(@"---begin");
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
NSBlockOperation *blockOp=[NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<3; i++) {
NSLog(@"---%d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp1=[NSBlockOperation blockOperationWithBlock:^{
for (int i=3; i<6; i++) {
NSLog(@"---%d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp2=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:2];
for (int i=6; i<9; i++) {
NSLog(@"---%d---%@",i,[NSThread currentThread]);
}
}];
//blockOp 依赖于blockOp1,即等blockOp1 执行完再执行 blockOp
[blockOp addDependency:blockOp1];
[queue addOperation:blockOp];
[queue addOperation:blockOp1];
[queue addOperation:blockOp2];
blockOp.completionBlock=^{
NSLog(@"---blockOp over");
};
NSLog(@"---end");
编译结果如下:
blockOp 依赖于blockOp1,等blockOp1里的任务执行完再执行blockOp的任务,blockOp执行完completionBlock回调打印---blockOp over. blockOp1和blockOp2执行顺序先后是不确定的(异步)。
- NSOperationQueue的取消
-(void)demo6
{
NSLog(@"---h begin");
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount=1;
NSBlockOperation *blockOp=[NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<3; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp1=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:1];
for (int i=3; i<6; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp2=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:3];
for (int i=6; i<9; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp3=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:4];
for (int i=9; i<12; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
[queue addOperation:blockOp];
[queue addOperation:blockOp1];
[queue addOperation:blockOp2];
[queue addOperation:blockOp3];
self.blockOperation=blockOp3;
self.queue=queue;
NSLog(@"---h end");
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//[self.blockOperation cancel];
[self.queue cancelAllOperations];
}
编译结果如下:
- NSOperationQueue的暂停恢复
-(void)demo6
{
NSLog(@"---h begin");
NSOperationQueue *queue=[[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount=1;
NSBlockOperation *blockOp=[NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<3; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp1=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:1];
for (int i=3; i<6; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp2=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:3];
for (int i=6; i<9; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *blockOp3=[NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:4];
for (int i=9; i<12; i++) {
NSLog(@"---h %d---%@",i,[NSThread currentThread]);
}
}];
[queue addOperation:blockOp];
[queue addOperation:blockOp1];
[queue addOperation:blockOp2];
[queue addOperation:blockOp3];
self.blockOperation=blockOp3;
self.queue=queue;
NSLog(@"---h end");
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
self.queue.suspended=!self.queue.suspended;
if (self.queue.suspended) {
NSLog(@"---h暂停");
}else
{
NSLog(@"---h恢复");
}
}
编译结果如下:

NSOperationQueue有个suspended属性,当为YES的时候暂停,为NO时执行。当我点击屏幕时打印暂停,打印结果可以看出并没有马上暂停,它会把正在执行的任务完成才暂停。