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

多线程-NSOperation

2016-05-30 20:42 429 查看
基本概念

//操作:(任务)想要执行的操作,想要做的事情

//队列:专门用来存放任务的

//使用步骤

//1.创建一个队列对象

//2.创建一个任务对象

//3.将任务对象放到队列中(系统会自动将任务从队列中取出来,并且开启新的线程去执行任务)

=====基本使用=====

//NSInvocationOperation创建任务

-(void)test1{

//1.创建队列

NSOperationQueue* queue = [[NSOperationQueue alloc] init];

//2.创建任务

//参数1:响应消息的对象

//参数2:需要执行的操作

//参数3:选择器中方法实参

NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longTimeOperation:) object:@0];

//3.将单个任务添加到队列中

[queue addOperation:operation];

//4.将多个任务添加到队列中

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

//创建一个任务

NSInvocationOperation* OP = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longTimeOperation:) object:[NSNumber numberWithInt:i]];

OP.name = [NSString stringWithFormat:@”我是子线程”];

//将任务放到队列中

[queue addOperation:OP];

}

}

-(void)longTimeOperation:(NSNumber*)number{

NSLog(@”%@,%@”,[NSThread currentThread],number);

}

//NSBlockOperation创建任务

-(void)test2{

//2.创建任务/操作

NSBlockOperation* Op = [NSBlockOperation blockOperationWithBlock:^{

[self longTimeOperation:@19];

}];

[self.queue addOperation:Op];

//========添加多个任务========

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

NSBlockOperation* Op = [NSBlockOperation blockOperationWithBlock:^{

[self longTimeOperation:@(i)];

}];

[self.queue addOperation:Op];

}

}

-(void)test3{

//将一个bolck类型的任务添加到队列中

[self.queue addOperationWithBlock:^{

//需要执行的操作

[self longTimeOperation:@0];

}];

}

-(void)test4{

[self.queue addOperationWithBlock:^{

NSData* data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@”http://preview.quanjing.com/tongro_rf002/tds003tg2260.jpg“]];

UIImage* image = [UIImage imageWithData:data];

//回到主线程

//拿到主队列

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

self.loadIMAGE.image = image;

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

}];

}];

}

=====高级应用=====

//最大并发数(限制每次同时执行的任务的个数),默认有多少个任务同时开启多少个线程

-(void)test5{

//设置队列的最大并发数(2~3)

self.queue.maxConcurrentOperationCount = 3;

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

[self.queue addOperationWithBlock:^{

[self longTimeOperation:@(i)];

sleep(1);

}];

}

}

//暂停、恢复队列

//暂停是暂停从队列中取出任务来执行,但是已经从队列里面取出来的任务,不再受队列的限制

//test6

- (IBAction)btnClick:(UIButton *)sender {

static int i = 0;

if (i == 0 ) {

i = 1;

[sender setTitle:@"开始" forState:UIControlStateNormal];
[self.queue setSuspended:YES];
}else{
i = 0;
[sender setTitle:@"暂停" forState:UIControlStateNormal];
[self.queue setSuspended:NO];
}


}

//取消队列

//将队列中所有的任务从队列中移除,不可以恢复。但是已经从队列中取出的任务不会被取消

//test7

- (IBAction)cancel:(id)sender {

[self.queue cancelAllOperations];

// [[NSOperationQueue mainQueue] cancelAllOperations];

}

//操作依赖

-(void)test8{

NSBlockOperation* block1 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”1”);

}];

NSBlockOperation* block2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”2”);

}];

//添加依赖关系,让B依赖A(A执行完再执行B);注意:1.依赖关系一定要在任务添加到队列之前添加2.不能循环依赖

[block2 addDependency:block1];

[self.queue addOperations:@[block1,block2] waitUntilFinished:NO];

NSLog(@”123”);

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