使用步骤 :
1. 先将需要执行的操作封装到一个NSOperation对象中.创建NSOperation对象.
2. 将NSOperation对象添加到NSOperationQueue中.
3. NSOperationQueue会自动将NSOperation取出来.
4. 将取出的NSOperation封装的操作自动放到一条对应的新线程中执行.
NSBlockOperation 基本使用演练
- 调用
start
方法 :- 操作只在当前线程执行
- (void)OPDemo1
{
// 创建操作
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
// 启动操作
[op start];
}
- 操作添加到队列 : 验证操作默认是异步的
- (void)OPDemo2
{
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建操作 : 操作默认是异步的
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
// 把操作添加到队列
[queue addOperation:op];
}
- 验证队列默认是并发性
- (void)OPDemo3
{
// 创建队列 : 队列默认是并发的
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
for (int i = 0; i < 10; i++) {
// 创建操作 : 操作默认是异步的
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%d %@",i,[NSThread currentThread]);
}];
// 把操作添加到队列
[queue addOperation:op];
}
}
开发建议
- NSOperationQueue只有一种类型.就是并发队列.
- 在实际开发时,如果要使用到NSOperationQueue,可以直接定义成全局的队列
- 定义和实例化全局队列,也可以采用
成员变量
的定义方式
@property (nonatomic,strong) NSOperationQueue *queue;
- (NSOperationQueue *)queue
{
if (_queue==nil) {
_queue = [[NSOperationQueue alloc] init];
}
return _queue;
}
NSBlockOperation
简写 : 非常重要开发中常用的代码
- (void)OPDemo4
{
[_queue addOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
}
- 线程间通信 : 非常重要开发中常用的代码
- (void)opDemo5
{
[_queue addOperationWithBlock:^{
NSLog(@"假装在努力下载...%@",[NSThread currentThread]);
// 下载完成回到主线程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@"更新UI...%@",[NSThread currentThread]);
}];
}];
}
- 设置执行块
- (void)opDemo6 {
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"==> %@", [NSThread currentThread]);
}];
[op addExecutionBlock:^{
NSLog(@"block 1 %@", [NSThread currentThread]);
}];
[_queue addOperation:op];
NSLog(@"%@", op.executionBlocks);
}
- 执行块和操作享有共同的属性设置,异步执行