多线程-NSOperation

基本概念
//操作:(任务)想要执行的操作,想要做的事情
//队列:专门用来存放任务的

//使用步骤
//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”);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值