您的位置:首页 > 运维架构

NSOperation简单讲解

2016-04-08 12:07 211 查看
前段时间,由于公司的业务调整和整体搬迁,无奈之下我选择了离职。离职前帮公司招聘一个负责维护的iOS,问了几个前来应聘的,问到多线程这块,很多人支支吾吾说不清楚,于是自己随意写个小Demo,给大家做个借鉴。

#import "ViewController.h"

@interface
ViewController ()

@property(nonatomic,strong)
NSOperationQueue *myQueue;

@end

@implementation ViewController

- (void)viewDidLoad {

[super
viewDidLoad];

self.myQueue=[[NSOperationQueue
alloc]
init];

[self demoOp1];

//[self demoOp2 ];

//[self demoOp3];

}

-(void)demoOp1{

// NSBlockOperation *block=[NSBlockOperation blockOperationWithBlock:^{

// NSLog(@"%@",[NSThread currentThread]);

// }];

//所有的自定义队列,都在子线程中运行

// [self.myQueue addOperation:block];

//新建线程是有开销的

//在设定同时并发的最大线程数时候,如果前一个线程工作完成,但是还没有销毁,会新建线程

//应用场景:网络开发下,下载工作!(线程开销:CPU,MEM)电量

//如果是3G,开3个子线程

//如果是WIFi,开6个子线程

[self.myQueue
setMaxConcurrentOperationCount:1];

for (int i=0; i<10; i++) {

[self.myQueue
addOperationWithBlock:^{

NSLog(@"%@",[NSThread
currentThread]);

}];

}

// [[NSOperationQueue mainQueue] addOperationWithBlock:^{

// NSLog(@"%@",[NSThread currentThread]);

// }];

}

-(void)demoOp2{

NSInvocationOperation *operation=[[NSInvocationOperation
alloc]
initWithTarget:self
selector:@selector(test:)
object:@"hahaha"];

[self.myQueue
addOperation:operation];

}

-(void)demoOp3{

NSBlockOperation *op1=[NSBlockOperation
blockOperationWithBlock:^{

NSLog(@"下载图片:%@",[NSThread
currentThread]);

}];

NSBlockOperation *op2=[NSBlockOperation
blockOperationWithBlock:^{

NSLog(@"修饰图片:%@",[NSThread
currentThread]);

}];

NSBlockOperation *op3=[NSBlockOperation
blockOperationWithBlock:^{

NSLog(@"保存图片:%@",[NSThread
currentThread]);

}];

NSBlockOperation *op4=[NSBlockOperation
blockOperationWithBlock:^{

NSLog(@"更新UI:%@",[NSThread
currentThread]);

}];

//设定执行顺序,addDependency依赖,可能会开多个,但不会太多

//依赖关系是可以跨队列的

[op2 addDependency:op1];

[op3 addDependency:op2];

[op4 addDependency:op3];

//GCD是串行队列,异步任务,只会开一个线程

[self.myQueue
addOperation:op1];

[self.myQueue
addOperation:op2];

[self.myQueue
addOperation:op3];

//所有UI的更新都在主线程上进行

[[NSOperationQueue
mainQueue] addOperation:op4];

}

-(void)test:(id)obj{

NSLog(@"%@--%@",[NSThread
currentThread],obj);

}

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