GCD中一些API的使用

GCD中一些API的使用

1.串行队列和并行队列

iOS中线程分为串行队列和并行队列,串行队列指的是任务按照先后顺序,依次执行;并行队列指的是任务不按照加入的先后顺序,并发的执行。

iOS中串行队列通过如下方式进行创建

dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_SERIAL);

需要注意的是,引号中的内容表示的是对该队列的描述,后面的参数代表的是串行队列。

并行队列通过如下方式进行创建

dispatch_queue_t queue = dispatch_queue_create("cn.bourbonz.www", DISPATCH_QUEUE_CONCURRENT);
或者
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

第一种方式中,第一个参数表示对该队列的描述,后一个参数表示这是一个并行队列.

第二种方式中,这个队列创建的是一个全局类型的并行队列,第一个参数表示当前队列的优先级,第二个参数含义未知。

需要注意的是,GCD是C语言系的东西,所以不遵循ARC机制。当创建队列用到

dispatch_queue_create

这个方法的时候,需要在该队列在不用时,进行释放

dispatch_release

2.变更队列的优先级

队列创建后的优先级是可以更改的,使用到的方法

dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue);

这里面是将第一个队列改成第二个队列的优先级

3.dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    });

这个方法是将任务n秒后加入队列,不是任务加入队列后n秒后执行,所以这里需要注意的是,如果前面的任务阻塞了,那么这里的时间可能就不准确了。

4.dispatch_group

这个方法是将多个队列的任务都执行完之后才进行下面的操作,执行代码如下

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

    });
    dispatch_group_async(group, queue, ^{

    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

    });

5.dispatch_barrier_async

在对文件读写过程中,读和写操作只能单一进行,读操作可以分开同时执行。

在GCD中可以通过此方法,在并行队列中快速对文件进行读写操作,该方法进行的操作是,只有此方法的事件处理完成之后,才进行后面的操作,这样就可以将读写操作分开

    dispatch_async(queue, ^{
        //读
    });
    dispatch_async(queue, ^{
        //读
    });
    dispatch_async(queue, ^{
        //读
    });

    dispatch_barrier_async(queue, ^{
       //写
    });
    dispatch_async(queue, ^{
        //读
    });
    dispatch_async(queue, ^{
        //读
    });

6.dispatch_sync

既然函数名包含了async(异步的意思),那么就应该有sync的函数。

异步队列方法是指不用等待函数的返回结果,就可以执行下去;

同步队列方法是指需要等待函数的返回结果,也就是必须要等到函数处理完才能继续执行。

那么在使用的过程中稍有不慎,就有可能会出现死锁的情况,比如如下情况

    dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"123");

    });

    dispatch_async(dispatch_get_main_queue(), ^{

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"123");

        });

    });

7.dispatch_apply

GCD中提供了循环方法,可以通过此方法进行快速遍历,

    dispatch_apply(10, queue, ^(size_t index) {

    });

需要注意的是,这个方法的执行不像for循环那样按照顺序来的,他的顺序是随机的。

8.线程的挂起和继续

        NSLog(@"线程暂停");
        dispatch_suspend(queue);
        NSLog(@"线程继续");
        dispatch_resume(queue);

需要注意的是不要在主现场执行此操作,避免阻塞主线程。

9.dispatch_once

在apple的文档中,推荐的单例创建方法是使用此方法进行创建。该方法保证了在程序运行中只执行一次

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        ///需要执行的操作
    });

10.GCD中的大文件读写

dispatch_io_create

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 03:52:14

GCD中一些API的使用的相关文章

GCD中如何延迟处理任务

在实际的开发中,经常会遇到想要在指定的时间间隔后执行某个处理 <一>在GCD中提供了dispatch_after函数来完成这一操作 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ <#code to be executed after a specified delay#>

小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载一(PhoneGap中的API)

之前本博连载过<构建跨平台APP:jQuery Mobile移动应用实战>一书.深受移动开发入门人员的喜爱. 从如今開始,连载它的孪生姐妹书phoneGap移动应用实战一书,希望以前是小白的你们,已经变成了大白. 3.6  PhoneGap中的API能干什么 本章主要介绍进行PhoneGap开发前所须要做好的准备,那么如今是不是该介绍一些关于PhoneGap的事了呢?事实上PhoneGap就是将HTML写成的页面显示出来.然后通过特定的JavaScript获取几组数据而已. 尽管说使用Phon

Appium中部分api的使用方法

使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建议多参考java-client-2.1.0-javadoc. 1.使用AndroidDriver,其已经继承了AppiumDriver    private AndroidDriver driver; @Before public void setUp() throws Exception {     DesiredCapabilities capabilities = ne

GCD 中Group的使用

使用Group实现:先执行一系列操作(在group中),执行完成后再执行别的操作. 1.创建group及任务队列(目的是让group中的所有任务执行完再执行别的任务) dispatch_group_t group = dispatch_group_create(); //创建一个group        dispatch_queue_t globeQ = dispatch_get_global_queue(0, 0); //该方法获取全局队列(每一次得到的都是同一个队列)    2.提交任务到g

Lua中C API栈操作

向栈中压入数据: lua_pushnil(lua_State*); lua_pushboolean(lua_State*, bool); lua_pushnumber(lua_State*, lua_Number); lua_pushinteger(lua_State*, lua_Integer) lua_pushlstring(lua_State*, const char*, size_t); lua_pushstring(lua_State*, const char*); 获取栈中元素的类型

GCD中的队列与任务

一.简介: Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统.它是一个在线程池模式的基础上执行的并行任务.在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题.GCD的工作原理是让一个程序,根据可用的处理资源,安排他们在任何可用的处理

在VB中利用API进行串口通信

本文转自http://blog.csdn.net/lyserver/article/details/4153335 '* ******************************************************* *'*    程序名称:basComm.bas'*    程序功能:在VB中利用API进行串口通信'*    作者:lyserver'*    联系方式:http://blog.csdn.net/lyserver'* ************************

多线程中的API

? 1 [NSThread sleepForTimeInterval:2]; //让当前线程睡眠2秒. 多线程中的API

VC中常见API函数用法(经验版)

1.设置对话框为无边框方法 ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0, SWP_FRAMECHANGED); 2.设置控件灰色与不灰色 void CMthread1Dlg::OnStop() { // TODO: Add your control notification handler code here m_bRun = FALSE; GetDlgItem(IDC_START)->EnableWindow(TRUE); GetDlgItem(IDC_