您的位置:首页 > 产品设计 > UI/UE

IOS--UI--NSOperation

2015-08-13 20:33 387 查看
NSOperation 的作用

1.配合使用 NSOperation 和 nsoperationQueue 也能实现多线程编程

注: NSOperation 是一个抽象类,不具备封装操作的能力,需要使用子类

①NSInvocationOperation

②NSBlockOperation

③自定义子类继承 NSOperation 实现内部方法

2.步骤

1>需要的执行操作封装到一个NSOperation 对象中;

2> 然后将 NSOperation 对象添加到NSOperationQueue 中

3>系统会自动将 nsoperationQueue 中的 NSOperation 取出来

4>将取出的 SOperation 封装的操作放到一条新线程中执行;

①NSInvocationOperation

.m
- (void)viewDidLoad {
[super viewDidLoad];

//封装操作 也就是创造操作对象 封装需要操作的任务
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download ) object:nil];

//    执行操作 start 启动上面的方法 默认主线程
[operation start];

}
- (void)download
{
NSLog(@"123%@",[NSThread currentThread]);
}
//只有放在NSOperationQueue 中才会异步执行


②NSBlockOperation

-(void)blockOperation{
//    1.封装操作

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"1--%@",[NSThread currentThread]);
}];
//通过-(void)addExecutionBlock:(void)(^)bloack; 添加更多操作
[operation addExecutionBlock:^{
NSLog(@"2--%@",[NSThread currentThread]);
}];

[operation addExecutionBlock:^{
NSLog(@"3--%@",[NSThread currentThread]);
}];

//    执行操作
[operation start];
}


注:只有 NSBlockOperation 的封装操作>1 才会开启异步执行

-(void)queue{
//并发对列
//封装操作
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download ) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector( run  ) object:nil];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"1--%@",[NSThread currentThread]);
}];
[operation3 addExecutionBlock:^{
NSLog(@"2--%@",[NSThread currentThread]);
}];
//创建队伍
NSOperationQueue *queue=[[NSOperationQueue alloc]init];

//    将操作加入队伍中
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];

}


注:

1.取出任务是有顺序的 但是任务是一起进行的

2.不需要加 start 方法

队伍的操作

①取消

-(void)cancelAllOperation;

②恢复和暂停队伍

BOOL setSuspended

YES 暂停 NO 恢复

③ 优先级



④操作依赖

① 同一队伍内的NSOperation 可以依靠依赖关系 来保证执行顺序

[operation2 addDependency:operation3];
//操作2 依赖操作1 要等1 做完之后2 才会做


② 在不同对列之间设置依赖 但不能相互依赖

//Error
[operation2 addDependency:operation3];
[operation3 addDependency:operation2];


④ 监听操作

-(void)operationListen{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"1--%@",[NSThread currentThread]);
}];
operation.completionBlock = ^{
//下载完 之后想做的事情
NSLog(@"下载完毕----%@",[NSThread currentThread]);
};

//创建队伍
NSOperationQueue *queue=[[NSOperationQueue alloc]init];

[queue addOperation:operation];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: