OC开线程的三种方式

第一种NSThread 


   //NSThread 方法1 需要手动start];
    NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(threadRun:) object:@"参数"];
   thread.name =@"线程1";
    //优先级 0.0-1.0 默认0.5 0.0最低1.0最高
    thread.threadPriority=0.6;




  [thread start];
    
    //NSThread 方法2
    [NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:@"参数"];
      //NSThread 方法3
    [self performSelectorInBackground:@selector(threadRun:) withObject:@"参数"];
    
}


//多个参数可以用数组或者字典
-(void)threadRun:(NSString *)param{
    
      //回到主线程
    [self  performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
}


第二种 GCD
-(void)gcdThread{
    
    /**第一种自己创建队列
     第一个参数:C语言的字符串,标签随便填
     第二个参数 队列的类型。
     DISPATCH_QUEUE_CONCURRENT并发 //开多条线程
     DISPATCH_QUEUE_SERIAL 串行 只开一条线程
     */
//    dispatch_queue_t queue= dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT);
    /**
     第二种拿系统的队列
     第一个参数 优先级
     第二个参数 预留给未来使用 随便填0
     */
    dispatch_queue_t queue=  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue, ^{
       //线程内
        
        dispatch_async(dispatch_get_main_queue(), ^{
           //回到主线程
        });
        
    });
    
}


/**
 
 gcd栅栏函数
 会先执行栅栏函数前面的异步任务
 然后执行栅栏函数
 再执行栅栏函数下面的异步任务
 */
-(void)barrier{
    
    /**这里的队列必须用dispatch_queue_create创建的
     不能用系统的dispatch_get_global_queue
     否则不会生效*/
    dispatch_barrier_async(dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT), ^{
        
    });
    
}
/**gcd队列组
 可以添加完成任务通知功能
 用于任务监听
 */
-(void)group{
    //创建队列
    dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
    // 创建队列组
    dispatch_group_t group=dispatch_group_create();
    //异步函数
    dispatch_group_async(group, queue, ^{
        NSLog(@"异步一");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"异步二");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"异步三");
    });
    


    //异步等
    dispatch_group_notify(group, queue, ^{
          NSLog(@"全部任务完成通知");
    });
    //死等 任务不完成 后面代码不执行
    // dispatch_group_wait(group, DISPATCH_TIME_FOREVER);


}
/**gcd快速迭代*/
-(void)apply{
    
    /**
     快速迭代
     第一个参数遍历的参数
     第二个参数队列必须是并发队列
     第三个参数 遍历的索引*/
    dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index) {
        
    });
    
}
/*
 第三种 线程
NSoperation
 */
-(void)operation{
    
    //第一种方式
//    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(startOperaion) object:nil];
   //第二种方式
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
         //执行线程任务
        NSURL *url=[NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1516809008589&di=f037ce52a7884e59ab83f0420e94a3c4&imgtype=0&src=http%3A%2F%2Fmvimg4.meitudata.com%2F5604ee3a30f7e560.jpg 


"];
       NSData *imageData= [NSData dataWithContentsOfURL:url];
       _image= [UIImage imageWithData:imageData];
       
    }];
    
    NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
        //执行线程任务
    }];
    NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
        //执行线程任务
    }];
    
    [operation addExecutionBlock:^{
        //可以追加任务
    }];
    operation.completionBlock = ^{
        //  完成监听
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            //主线程更新任务
            if(_image){
               // NSLog(@"主线程更新任务");
                 [_iv setImage:_image];
            }
           
        }];
    };
    
    //如果2添加依赖1 那么执行完1才会执行2
    [operation2 addDependency:operation1];
    //如果operation1添加依赖operation 那么执行完operation才会执行operation1
    [operation1 addDependency:operation];
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    //设置最大并发数
   //   queue.maxConcurrentOperationCount=3;
    [queue addOperation:operation];
      [queue addOperation:operation1];
      [queue addOperation:operation2];


  // [queue setSuspended:YES];//暂停 NO可以恢复 不能暂停正在执行状态的任务
   // [queue cancelAllOperations];//取消 不可以恢复
//
//    //简便方法
//    [queue addOperationWithBlock:^{
//        //线程任务;
//    }];
    
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值