美文网首页
NSOperation

NSOperation

作者: DPL1024 | 来源:发表于2019-01-29 13:45 被阅读0次

NSOperation是苹果在GCD的基础上封装,一套面向对象的多线程操作API。NSOperation是抽象基类,不能直接使用,系统为我们提供了NSInvocationOperation和NSBlockOperation两种子类来添加操作。此外,还可以自定义NSOperation子类来实现添加操作。

将创建好的操作,添加到队列(NSOperationQueue)中,即可实现多线程编程。

NSInvocationOperation

- (void)invocationOperation {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo1:) object:param1];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo2:) object:param2];
    [queue addOperation:op1];
    [queue addOperation:op2];
}

NSBlockOperation

- (void)blockOperation {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        // 想要执行的任务
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        // 想要执行的任务
    }];
    [queue addOperation:op1];
    [queue addOperation:op2];
}

另外还有一种简单写法

[queue addOperationWithBlock:^{
    // 想要执行的任务
}];

向操作中追加任务

[op addExecutionBlock:^{
    // 想要追加的任务
}];

设置最大并发数

最大并发数,是指同时又多少条线程执行任务。

[queue setMaxConcurrentOperationCount:5];

当最大并发数设置为1时,任务顺序执行。
任务只是顺序执行,不能保证只开一条线程执行任务。

// 可以保证任务按照任务1 -> 任务2 -> 任务3的顺序执行
- (void)serialQueue {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue setMaxConcurrentOperationCount:1];
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        // 任务1
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        // 任务2
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        // 任务3
    }];
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
}

队列操作

所有操作都只能作用在处于等待状态的任务,对已经在执行中的任务无效。

暂停

[queue setSuspended:YES];

恢复

[queue setSuspended:NO];

取消所有操作

[queue setSuspended:NO];

操作依赖

任务1必须在任务2执行完成之后执行

所有依赖添加操作只能在任务添加到队列之前执行。

- (void)dependency {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        // 任务1
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        // 任务2
    }];
    
    [op1 addDependency:op2];
    
    [queue addOperation:op1];
    [queue addOperation:op2];
}

操作监听

- (void)completion {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        // 任务1
    }];
    op.completionBlock = ^{
        // 任务1执行完成
    };
    [queue addOperation:op];
}

线程间通信

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // UI操作
}];

自定义操作

实现自定义操作,继承自NSOperation,重写main方法,在main方法中定义操作要执行的任务。

@interface DPLOperation : NSOperation
@end

#import "DPLOperation.h"
@implementation DPLOperation
- (void)main {
    // 想要执行的任务
}
@end

注意:暂停任务等操作对自定义操作无效。

解决方法,利用isCancelled属性,来监听任务是否被取消。

if (self.isCancelled) {
    return;
}

相关文章

网友评论

      本文标题:NSOperation

      本文链接:https://www.haomeiwen.com/subject/szlxsqtx.html