NSOperation的基本使用

NSOperation是对GCD的封装,NSOperation是一个抽象基类,只能使用它的子类。可以把NSOperation理解为一个操作,一项任务。

NSOperation.h头文件中,可以看到子类有NSBlockOperation以及NSInvocationOperation。当然我们也可以自定义,需要继承NSOperation,并且重写必要的方法。

NSBlockOperation的使用

1
2
3
4
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"currentThread = %@ ", [NSThread currentThread]);
}];
[operation start];

有点像NSThread一样,先初始化,当然调用start。代码块就会执行。

追加任务

1
2
3
[operation addExecutionBlock:^{
NSLog(@"追加任务 task1 currentThread = %@ ", [NSThread currentThread]);
}];
1
2
3
4
追加任务 task1 currentThread = <NSThread: 0x60000006f040>{number = 1, name = main}
追加任务 task3 currentThread = <NSThread: 0x60800026c540>{number = 5, name = (null)}
追加任务 task2 currentThread = <NSThread: 0x600000264f40>{number = 4, name = (null)}
currentThread = <NSThread: 0x60800026c4c0>{number = 3, name = (null)}
  • 在主线程或者在子线程中执行任务。
  • 会并行执行任务

NSInvocationOperation的使用

1
2
3
4
5
6
7
8
9
NSOperation *operation = [[NSInvocationOperation alloc]
initWithTarget:self
selector:@selector(invocationOperation:)
object:@{@"name": @"lucaslee"}];
[operation start];
- (void)invocationOperation:(NSDictionary *)info {
NSLog(@"currentThread = %@, info = %@", [NSThread currentThread], info);
}

同NSThread一样,invocationOperation方法的参数可以为nil。

NSBlockOperation与NSInvocationOperation区别

区别

NSBlockOperation使用代码块的方式初始化,可以追加任务。
NSInvocationOperation使用selector方式初始化,不可以追加任务。

相同

都是NSOperation的子类。并且都需要调用start启动。

自定义Operation

  • 继承NSOperation
  • 重写- (void)main方法
1
2
3
4
5
6
7
8
9
10
@interface LZCustomOperation : NSOperation
@end
@implementation LZCustomOperation
- (void)main {
NSLog(@"currentThread = %@", [NSThread currentThread]);
}
@end

使用

1
2
NSOperation *operation = [[LZCustomOperation alloc] init];
[operation start];

生命周期

生命周期

取消

1
2
3
@property (readonly, getter=isCancelled) BOOL cancelled;
- (void)cancel;

准备

1
@property (readonly, getter=isReady) BOOL ready;

执行中

1
@property (readonly, getter=isExecuting) BOOL executing;

完成

1
@property (readonly, getter=isFinished) BOOL finished;
坚持原创技术分享,您的支持将鼓励我继续创作!