美文网首页
iOS多线程开发之GCD简单使用(2)

iOS多线程开发之GCD简单使用(2)

作者: devRen | 来源:发表于2016-02-23 05:11 被阅读79次

一、主队列介绍

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

 dispatch_queue_t queue=dispatch_get_main_queue();

1)使用异步函数执行主队列中得任务,代码示例:

    //1.获取主队列
    dispatch_queue_t queue=dispatch_get_main_queue();
    //2.把任务添加到主队列中执行
    dispatch_async(queue, ^{
        NSLog(@"下载图片1----%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"下载图片2----%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"下载图片3----%@",[NSThread currentThread]);
    });
    //打印主线程
    NSLog(@"主线程----%@",[NSThread mainThread]);
异步函数主队列打印结果.png

总结:不会开启新的线程

2)使用同步函数,在主线程中执行主队列中得任务,会发生死循环,任务无法往下执行。示意图如下:

死循环示意图.png

二、简单使用

1.在全局并发队列中,分别用异步函数和同步函数执行任务1和任务2,问:任务1和任务2是在主线程执行还是子线程执行,还是单独再开启一个新的线程?

- (void)viewDidLoad {
    [super viewDidLoad];
    //NSThread隐式创建线程(自动启动)
    [self performSelectorInBackground:@selector(text) withObject:nil];
}
-(void)text{
    NSLog(@"当前线程---%@",[NSThread currentThread]);
    //创建全局的并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //异步函数
    dispatch_async(queue, ^{
        NSLog(@"NSLog(任务1所在的线程----%@",[NSThread currentThread]);
    });
    //同步函数
    dispatch_sync(queue, ^{
        NSLog(@"NSLog(任务2所在的线程----%@",[NSThread currentThread]);
    });
}

答:任务1和任务2在不同子线程,任务1新开线程,任务2在当前线程,但都不在主线程。


任务1和任务2打印结果.png

2.开启子线程,加载图片

//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示
-(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, ^{
        //3.从网络上下载图片
        NSURL *url = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494ee460de6182ff5e0fe99257e80.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        
        //4.回到主线程,展示图片
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.button setBackgroundImage:image forState:UIControlStateNormal];
            
        });
    });
}
运行效果.png

三、线程间的通信

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   // 执行耗时的异步操作...
    
    
   dispatch_async(dispatch_get_main_queue(), ^{
       // 回到主线程,执行UI刷新操作
   });
});

相关文章

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

  • IOS GCD

    转载: IOS GCD GCD 是在iOS开发多线程技术里面,使用最简单,执行效率最高的,是相对底层的API,都是...

  • iOS GCD的基本使用

    GCD在iOS中多线程开发中使用频繁,使用方便简单,可以满足我们大部分需求。其使用方法如下: 1、基本认识 GCD...

  • 关于GCD的使用

    在iOS开发中,对于多线程,大多数开发者使用苹果提供的简单的GCD, 频繁的使用GCD,并发队列并不会去管理最大并...

  • iOS多线程开发之GCD简单使用(2)

    一、主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放...

  • 多线程和AFN网络框架配合使用

    ios的多线程一般有NSOperation和GCD.NSOperation基本使用: GCD基本使用: 简单的多线...

  • iOS-多线程篇—GCD介绍

    iOS开发多线程篇—GCD介绍一、简单介绍1.什么是GCD?全称是Grand Central Dispatch,可...

网友评论

      本文标题:iOS多线程开发之GCD简单使用(2)

      本文链接:https://www.haomeiwen.com/subject/edmbkttx.html