美文网首页
GCD基础知识合集

GCD基础知识合集

作者: EagleOne | 来源:发表于2016-01-14 17:09 被阅读51次

    GCD概念简单理解

    GCD是基于C的Api。不需要自己管理线程生死。只需要创建队列,把任务放进队列里面就可以了。
    GCD有两个核心概念。一个是任务,一个是队列。

    同步执行和异步执行

    同步函数:在当前线程中执行,不开启新的线程

    dispatch_sync(dispatch_queue_t queue, dispatch_block_tblock);
    

    异步函数:具备开启线程的能力。

    dispatch_async(dispatch_queue_t queue, dispatch_block_tblock);
    
    队列
    并发队列

    自动开启多个线程,并且可以让多个任务同时执行。
    仅仅在异步函数(dispatch_async)下有效。

    串行队列

    让线程一个接着一个的执行。一条线程执行完后再执行下一条线程。

    并发队列

    并发队列不需要手动创建。以下是创建代码。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT// 队列的优先级
                                                           , 0);//unsignedlongflags此参数暂时无用,用0即可
    全局并发队列的优先级
    #defineDISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
    #defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认   (中)
    #defineDISPATCH_QUEUE_PRIORITY_LOW (-2)// 低
    #defineDISPATCH_QUEUE_PRIORITY_BACKGROUND       
    INT16_MIN // 后台
    

    串行队列

    使用dispatch_queue_create函数创建串行队列
    dispatch_queue_create(constchar*label, //队列名称
    dispatch_queue_attr_tattr);//队列属性,一般用NULL即可
    dispatch_queue_t queue = dispatch_queue_create("isQueue", NULL);//创建
    dispatch_release(queue);//非ARC时候需要释放手动创建的队列
    
    使用主队列(跟主线程相关联的队列)
    主队列是GCD自带的一种特殊的串行队列
    放在主队列中的任务,都会放到主线程中执行
    使用dispatch_get_main_queue()获得主队列
    dispatch_queue_t queue = dispatch_get_main_queue();
    

    使用dispatch_sync同步函数时候,在主线程中往主队列添加任务会造成死锁。

    队列与任务的结合

    |函数|全局并发队列 |手动创建串行队列 |主队列|
    | ------------- |:-------------:| -----:|
    | 同步(sync) |没有开启新线程 串行执行任务|没有开启新线程 串行执行任务 |没有开启新线程 串行执行任务
    |异步 (async) |有开启新线程 并发执行任务|有开启新线程 串行执行任务|没有开启新线程 串行执行任务

    线程间的通讯

    更新UI,数据等都是要回到主线程的。不能在子线程。

    //获取全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSLog(@"-子线程-- 开始下载图片--%@",[NSThread currentThread]);
        //下载数据是耗时操作放到子线程
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://b.hiphotos.baidu.com/image/pic/item/b219ebc4b74543a94369f4cb1c178a82b9011442.jpg"]]];
    
            dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"-主线程-- 刷新UI--%@",[NSThread currentThread]);
            //回到主线程刷新UI
            self.imageView.image = image;
        });
    });

    相关文章

      网友评论

          本文标题:GCD基础知识合集

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