随笔- 443  文章- 77  评论- 996  阅读- 105万 

ios中多线程有三种,NSTread, NSOperation,GCD

这篇就讲讲GCD的基本用法

平时比较多使用和看到的是:

复制代码
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //异步操作代码块

        dispatch_async(dispatch_get_main_queue(), ^{

            //回到主线程操作代码块

        });

    });
复制代码

比较多的用于更新ui操作

比如从数据库获取数据需要花较长的时间,又不希望卡主线程,就把获取数据库数据操作放在异步操作代码快中,等获取结束,回调主线程,更新ui,在主线程操作代码块中进行操作

 

下面我们来解析一下这代码块中的每个方法:

复制代码
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

表示异步操作,与之对应的是

dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>),同步操作,block中的代码执行完了才能执行后面的操作

方法中第一个参数 dispatch_queue_t queue 表示队列,无非是两种:串行和并行,另外可自建串行或并行队列
获取系统串行队列,也就是主线程串行队列:

dispatch_get_main_queue()

获取系统并行队列:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

其中第一个参数,是队列优先级,有四种:

#define DISPATCH_QUEUE_PRIORITY_HIGH 2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

会根据优先级高低,进行处理

自建队列:

dispatch_queue_create("com.example.serial", NULL);

第一个参数,文档规范说:
A string label to attach to the queue.这个字符串需要唯一性,一般是以上形式呈现

第二个参数传NULL或者 DISPATCH_QUEUE_SERIAL 表示串行
传 DISPATCH_QUEUE_CONCURRENT表示并行

当执行结束,必须要有 dispatch_release(),将队列释放
复制代码

最近看到一篇文章讲到GCD, 比较深入,还有些没有理解,以上我描述的内容是GCD较为基础的用法,一般程序也就用到这些

http://justsee.iteye.com/blog/1883409

感谢作者如此深入的分析,受益匪浅

 

 posted on   咖啡机(K.F.J)  阅读(1029)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示