GCD多线程2

一、主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。
如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程。

(1)使用异步函数执行主队列中的任务

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

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

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    dispatch_async(mainQueue, ^{
        NSLog(@"使用异步函数执行主队列中的任务1--%@",[NSThread currentThread]);
    });

dispatch_async(mainQueue, ^{
    NSLog(@"使用异步函数执行主队列中的任务2--%@",[NSThread currentThread]);
});
    dispatch_async(mainQueue, ^{
        NSLog(@"使用异步函数执行主队列中的任务3--%@",[NSThread currentThread]);
    });
}

打印结果:
这里写图片描述

(2)使用同步函数,在主线程中执行主队列中的任务,会发生死循环

二、
1、任务1单独开启一个新的线程,任务2在主线程执行。

- (void)viewDidLoad
 {
       [super viewDidLoad];
        //开启一个后台线程,调用执行test方法
         [self performSelectorInBackground:@selector(test) withObject:nil];
     }

 -(void)test
 {
        NSLog(@"当前线程---%@",[NSThread currentThread]);
         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

         //异步函数
         dispatch_async(queue, ^{
                 NSLog(@"任务1所在的线程----%@",[NSThread currentThread]);
             });

         //同步函数
         dispatch_sync(queue, ^{
                 NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);
             });
     }

打印结果:这里写图片描述

2.在子线程加载图片完毕后,主线程拿到加载的image刷新UI界面

- (void)viewDidLoad
 {
       [super viewDidLoad];

 }

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
        //1.获取一个全局串行队列
         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
         //2.把任务添加到队列中执行
         dispatch_async(queue, ^{

                 //打印当前线程
                 NSLog(@"%@",[NSThread currentThread]);
               //3.从网络上下载图片
                 NSURL *urlstr=[NSURL URLWithString:@"http://upload.ct.youth.cn/2015/0608/1433725303485.jpg"];
                 NSData *data=[NSData dataWithContentsOfURL:urlstr];
                 UIImage *image=[UIImage imageWithData:data];
                 //提示
                 NSLog(@"图片加载完毕");

                 dispatch_async(dispatch_get_main_queue(), ^{
                     self.imageView.image = image;
                     //打印当前线程
                    NSLog(@"%@",[NSThread currentThread]);
                 });
             });
    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值