GCD的API
来源:互联网 发布:无极为什么是烂片知乎 编辑:程序博客网 时间:2024/06/02 05:25
Dispatch Queue
dispatch Queue(queue,^{//想执行的任务});
dispatch_queue_create
通过 GCD 的 API 生成 Dispatch Queue.
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.xzeroplus.gcd.MySerialDispatchQueue",NULL);
第一个参数线程的名称,第二参数为 Dispatch Queue 的类型,NULL 表示为 Serial Dispatch 。
生成 Concurrent Dispatch Queue 线程则第二个参数为 CONCURRENT_DISPATCH_QUEUE ;
一个 Serial Dispatch 使用一个线程,等待现在执行中处理结束;一个 Concurrent Dispatch Queue 可以使用多个线程,不等待现在执行中的处理结束。
使用 dispatch_release() 释放queue;
Main Dispatch Queue / Global Dispatch Queue
Main Dispatch Queue 是主线程中执行的Dispatch Queue,为Serial Dispatch。
dispatch_queue_t mainDispatchQueue = dispatch_get_main_queue();
Global Dispatch Queue 是所有应用程序都能够使用的 Concurrent Dispatch Queue ,有四个优先级。
dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
Dispatch Queue 的种类
dispatch_set_target_queue
用 dipatch_queue_create 函数生成的 Dispatch Queue 都是默认优先级的。而使用 dispatch_set_target_queue 可以变更优先级。
dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.xzeroplus.gcd.MySerialDispatchQueue",NULL); dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);dispatch_set_target_queue(mySerialDispatchQueue,globalDispatchQueueBackground);
dispatch_set_target_queue 函数的指定第一个参数的优先级与第二个参数的优先级相同。
dispatch_after
dispatch_after 函数可以指定在一段时间后运行。
指定在3秒后运行
dispatch_time_t t = dispatch_time(DISPATCH_TIME_NOW,3ull * NSEC_PER_SEC);dispatch_after(time,dispatch_get_main_queue(),^{ NSLog(@"waited at least three seconds.");});
Dispatch Group
往一个 Serial Dispatch Queue 中加入多个block,会按顺序执行,在最后填加结束处理很容易实现。但是 Concurrent Dispatch Queue 或者多个 Dispatch Queue 同时使用,在最后填加结束处理就颇为麻烦。
这种情况下就可以使用 Dispatch Group 。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group,queue,^{NSLog(@"blk0");});dispatch_group_async(group,queue,^{NSLog(@"blk1");});dispatch_group_async(group,queue,^{NSLog(@"blk2");});dispatch_group_notify(group,dispatch_getmain_queue(),^{NSLog(@"done");});dispatch_release(group);
执行顺序
blk1blk2blk0done
前三个顺序不定,但是done一定是在最后输出。
dispatch_group_wait(group,DISPATCH_TIME_FOREVER) 可设置等待时间,DISPATCH_TIME_FOREVER 为永久等待,即是group未执行完则一直等待。
返回值为0和1,0表示执行结束。
dispatch_barrier_async
dispatch_barrier_async 函数回等待追加到 Concurrent Dispatch Queue 上的并行执行的处理全部结束之后,再将指定的处理追加到该 Concurrent Dispatch Queue 中。然后在由 dispatch_barrier_async 函数追加的处理执行完毕后,Concurrent Dispatch 才恢复为一般的动作,然后又开始执行。
dispatch_async(queue,blk0_for_reading);dispatch_async(queue,blk1_for_reading);dispatch_async(queue,blk2_for_reading);dispatch_async(queue,blk3_for_reading); //等待上面的执行完再执行 dispatch_barrier_asyncdispatch_barrier_async(queue,blk_for_writing); //等待 dispatch_barrier_async 执行完再执行下面的dispatch_async(queue,blk4_for_reading);dispatch_async(queue,blk5_for_reading);dispatch_async(queue,blk6_for_reading);dispatch_async(queue,blk7_for_reading);
dispatch_barrier_async追加的处理同时只执行1个。
dispatch_sync
async 是非同步的意思,sync 则是同步的意思。用 dispatch_sync 添加的 Dispatch Queue 会顺序执行,即是在追加Block结束之后,dispatch_sync函数会一直等待。
dispatch_apply
dispatch_apply 函数是 dispatch_sync 和 Dispatch Group的关联 API。该函数按指定的次数将指定的Block追加到指定的 Dispatch Queue 中,并等待全部处理执行结束。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_apply(10, queue, ^(size_t index){ NSLog(@"@zu",index);});NSLog(@"done");
执行顺序
4103526897done
dispatch_apply() 函数第一个参数为重复次数,第二个参数为追加对象 Dispatch Queue ,第三个参数为追加处理。
dispatch_suspend / dispatch_resume
dispatch_suspend用于挂起Dispatch Queue。
dispatch_resume用于恢复Dispatch Queue。
dispatch_suspend(queue);...dispatch_resume(queue);
dispatch_once
dispatch_once函数是保证应用程序执行一次指定处理的API。
static dispatch_once_t pred;dispatch_once (&pred,^{ //初始化});
- GCD的API
- GCD API
- GCD中一些API的使用
- GCD API使用
- 【读书笔记】iOS-GCD-API
- iOS GCD 大部分API
- GCD API讲解<二>
- swift GCD新API
- GCD API讲解<三>
- 【读书笔记】Objective-C高级编程--GCD的API
- GCD API 理解 (一)
- GCD API记录(二)
- GCD API 记录 (三)
- GCD编程网络编程API
- GCD 多线程API编程笔记
- GCD常用基本API介绍以及创建单例的两种方式
- iOS与OS多线程和内存管理---GCD的API详解
- GCD详解及实现- 常用API
- 组件中引入 jquery 需要修改的地方
- Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~
- Ubuntu Desktop 16.04下安装Chrome
- c++基础知识(2)
- AVL树的旋转操作
- GCD的API
- 【动态规划】Leetcode编程题解:516. Longest Palindromic Subsequence Add to List
- Android 二维码扫描,识别率非常高
- MyEclipse启动Tomcat错误org.apache.tomcat.jni.Error: 730060: ????l????????????ó???????????òl????÷?ú?
- 散列结构的实现
- Linux内存管理(六)——常见函数
- 安卓avd无法正常启动
- Hold住Leetcode——Intersection of Two Arrays
- phantomjs