您的位置:首页 > 移动开发 > IOS开发

iOS -- 多线程之NSOperation

2016-08-05 12:04 405 查看

NSOperation相关使用介绍

NSOperation相关使用介绍
NSOperation 一一 基础使用

NSOperation 一一 基础使用

@implementation ViewController
#pragma mark - 懒加载
- (NSOperationQueue *)quque{
if (_quque == nil) {
_quque = [[NSOperationQueue alloc] init];
}
return _quque;
}

#pragma mark - 基本概念
//1.两个核心概念
//a.操作(NSOperation):想要做的事情
//NSOperation是抽象类,不能直接使用它去创建对象,要使用它的子类(NSInvocationOperation\NSBlockOperation)

//b.队列(NSOperationQueue):存放操作的容器

//2.步骤
//a.创建一个队列
//b.创建一个操作
//c.将操作添加到队列中
//操作添加到队列中以后,系统会自动将操作取出来,放到新的线程中执行

#pragma mark - UITouch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[self test7];
}

#pragma mark - 高级操作
//依赖关系
//如果希望操作A在操作B执行完后再执行,需要依赖关系;让操作A依赖操作B
- (void)test7{

//1.创建两个操作
NSBlockOperation * operationA = [NSBlockOperation blockOperationWithBlock:^{

[self longtimeOperation:@10];

}];

NSBlockOperation * operationB = [NSBlockOperation blockOperationWithBlock:^{

[self longtimeOperation:@20];
}];

//操作B结束后会调用CompletionBlock  blcok
[operationB setCompletionBlock:^{

NSLog(@"操作B结束");
NSLog(@"++:%@", [NSThread currentThread]);

}];
//2.添加依赖关系
//让操作A依赖操作B(操作B执行结束后才执行操作A)
//注意:1.先添加依赖关系,再将操作放到队列中  2.添加依赖关系的时候不能有循环依赖(也不能相互依赖)

[operationA addDependency:operationB];

//3.将两个操作添加到队列中
[self.quque addOperations:@[operationB, operationA] waitUntilFinished:NO];
}

//取消队列(将队列中操作销毁,没有办法在复原)
//已经从队列中取出来的操作,没有办法取消
- (IBAction)cancel:(id)sender {

//取消队列中所有的任务
[self.quque cancelAllOperations];

}

//队列暂停/恢复
- (IBAction)suspend:(id)sender {

static int  i = 0;
UIButton * btn = (UIButton *)sender;

//第一次点击就暂停
if (i == 0) {
i = 1;
[btn setTitle:@"恢复" forState:UIControlStateNormal];

//让队列暂停(系统暂停从队列总取出操作,放到线程中执行;但是队列暂停之前已经从队列取出来的操作会继续执行)
[self.quque setSuspended:YES];

}else{
i = 0;
[btn setTitle:@"暂停" forState:UIControlStateNormal];

//恢复队列
[self.quque setSuspended:NO];
}

}

#pragma mark - 最大并发数
- (void)test6{

//使用NSOperation结合NSOperationQueue实现的多线程,是异步并发的
//最大并发数指,当前这个队列中,一次可以同时执行的操作数的最大值(最多可以同时执行的操作)---间接的在控制线程数
//一般设置为2-3
self.quque.maxConcurrentOperationCount = 3;

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

[self.quque addOperationWithBlock:^{

[self longtimeOperation:[NSNumber numberWithInt:i]];

}];
}

}

#pragma mark - !!!线程间通信
- (void)test5{

[self.quque addOperationWithBlock:^{

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

//在子线程中下载json数据
NSURL * url = [NSURL URLWithString:@"http://yuting.local/shareX/qiushi.json"];
NSData * data = [NSData dataWithContentsOfURL:url];
NSDictionary * dcit = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

//将字典传回主线程
//拿到主队列,在主队列中添加操作(这个主队列和GCD中的主队列是一样)
[[NSOperationQueue mainQueue] addOperationWithBlock:^{

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

}];
}];
}

#pragma mark - NSOperation的基本使用
//使用NSBlockOperation更简单的创建一个操作
- (void)test4{

//1.在队列添加一个操作
//block中的
4000
代码段就是需要在子线程中执行的任务
[self.quque addOperationWithBlock:^{

[self longtimeOperation:@4];

}];
}

//使用NSBlockOperation简单的创建一个操作
- (void)test3{

//1.创建一个操作
//block中的代码段就是需要在子线程中执行的任务
NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{

[self longtimeOperation:@10];

}];

//2.将操作添加到队列中
[self.quque addOperation:operation];

}

//创建多个NSInvocationOperation操作
- (void)test2{

for (int i = 0; i < 10; i++) {
//1.创建操作
NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longtimeOperation:) object:[NSNumber numberWithInt:i]];

//2.将操作放到队列中(多次调用addOperation方法可以将多个操作添加到队列中)
[self.quque addOperation:operation];

}
}

//创建一个NSInvocationOperation操作
- (void)test1{

//1.创建一个队列
NSOperationQueue * queue = [[NSOperationQueue alloc] init];

//2.创建一个操作
//参数1:效应消息的对象
//参数2:消息(需要在子线程中执行的任务)
//参数3:消息的实参
NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longtimeOperation:) object:@1];

//3.将操作添加到队列中
[queue addOperation:operation];
}

#pragma mark - 耗时操作
- (void)longtimeOperation:(NSNumber *)i{
sleep(3);
NSLog(@"%@%@", [NSThread currentThread], i);
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 ios