`

GCD之Dispatch Queue

GCD 
阅读更多

iOS中多线程编程工具主要有:

  •  NSThread
  • NSOperation
  • GCD

这三种方法都简单易用,各有千秋.但无疑GCD是最有诱惑力的,因为其本身是apple为多核的并行运算提出的解决方案.虽然当前移动平台用双核的不多,但不影响GCD作为多线程编程的利器(ipad2已经是双核了,这无疑是一个趋势).

GCD是和block紧密相连的,所以最好先了解下block(可以查看这里).GCD是C level的函数,这意味着它也提供了C的函数指针作为参数,方便了C程序员.

下面首先来看GCD的使用:

 

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

 

async表明异步运行,block代表的是你要做的事情,queue则是你把任务交给谁来处理了.(除了async,还有sync,delay,本文以async为例).

之所以程序中会用到多线程是因为程序往往会需要读取数据,然后更新UI.为了良好的用户体验,读取数据的操作会倾向于在后台运行,这样以避免阻塞主线程.GCD里就有三种queue来处理.

1. Main queue:

  顾名思义,运行在主线程,由dispatch_get_main_queue获得.和ui相关的就要使用Main Queue.

2.Serial quque(private dispatch queue)

  每次运行一个任务,可以添加多个,执行次序FIFO. 通常是指程序员生成的,比如:

NSDate *da = [NSDate date];
NSString *daStr = [da description];
const char *queueName = [daStr UTF8String];
dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);

3. Concurrent queue(global dispatch queue):

可以同时运行多个任务,每个任务的启动时间是按照加入queue的顺序,结束的顺序依赖各自的任务.使用dispatch_get_global_queue获得.

所以我们可以大致了解使用GCD的框架:

 

复制代码
dispatch_async(getDataQueue,^{
    //获取数据,获得一组后,刷新UI.
    dispatch_aysnc (mainQueue, ^{
    //UI的更新需在主线程中进行
};
}
)
复制代码

 

由此可见,GCD的使用非常简单,以我的使用经验来看,以后会逐步淘汰使用NSOperation而改用GCD.

分享到:
评论

相关推荐

    iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)1

    dispatch_queue_t queue = dispatch_queue_create("com.gcd-dispatch_group_async(gro

    iOS应用程序中通过dispatch队列控制线程执行的方法

    1. dispatch_queue_t queue = dispatch_queue_create(“com.dispatch.serial”, DISPATCH_QUEUE_SERIAL); //生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程

    IOS 多线程GCD详解

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。 dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。 #definedispatch_get_main_queue() \DISPATCH...

    GCD基本概念

    此文档介绍了GCD的基本概念及核心方法,Dispatch Queue,Dispatch Source等等特性。

    dispatch_barrier_(a)sync

    在将任务插入到queue的时候, dispatch_barrier_sync需要等待自己的任务结束之后才会继续程序,然后插入被写在它后面的任务。 2、dispatch_barrier_async:异步栅栏函数会开辟新线程执行block;ispatch_barrier_...

    派遣-Apple的Grand Central Dispatch的Rust包装器-Rust开发

    Apple的Grand Central Dispatch(GCD)的防锈包装。 GCD是任务并行性的一种实现,它允许将任务提交到用于Apple的Grand Central Dispatch(GCD)的Rust包装器的队列。 GCD是任务并行性的一种实现,它允许将任务提交到...

    Async.OC:Objective-C中的语法糖,用于Grand Central Dispatch中的异步调度

    异步OC 用Objective-C重写... 代替熟悉的GCD语法: dispatch_async (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0 ), ^{ NSLog ( @" A: This is run on the background " ); dispatch_async ( dis

    详解iOS多线程GCD问题

    GCD是Grand Central Dispatch的简称,它是基于C语言的。如果使用GCD,完全由系统管理线程,我们不需要编写线程代码。只需定义想要执行的任务,然后添加到适当的调度队列(dispatch queue)。GCD会负责创建线程和调度你...

    iOS并发编程指南.pdf

    苹果官方文档的翻译,详细讲解。NSOperation+NSOperationQueue,GCD+dispatch_queue,RunLoop等详细介绍。

    详解IOS串行队列与并行队列进行同步或者异步的实例

    详解IOS串行队列与并行队列进行同步或者异步的实例 IOS中GCD的队列分为串行队列和并行队列,任务分为同步任务和异步任务,他们的排列组合有四种情况,... dispatch_queue_t concurrentQueue = dispatch_queue_create(c

    多线程与GCD的简单使用

    简单的线程dome,适合初学者的使用, //dispatch_async(queue,^{});... //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 得到全局队列 //diapatch_get_main_queue() 得到主线程,即UI队列

    队列器:队列器是一个队列管理器,建立在OperationQueue和Dispatch(aka GCD)之上

    Queuer是一个队列管理器,建立在和 (aka GCD)之上。 它使您可以轻松地创建任何异步和同步任务,全部由一个队列管理,只需几行。 这是所有功能的列表: 可在所有Swift兼容平台(甚至Linux)上运行 易于使用 ...

    详解IOS中GCD的使用

    Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行...

    Async:Objective-C中的语法糖,用于Grand Central Dispatch中的异步调度

    异步的Objective-C中的语法糖,用于Grand Central Dispatch... 代替熟悉的GCD语法: dispatch_async (dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0 ), { NSLog ( @" ===>>> This is run on the b

    详解iOS多线程GCD的使用

    Grand Central Dispatch(GCD)是异步执行任务的技术之一 dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。 /*! * @function dispatch_get_main_queue * * @...

    CocoaAsyncSocket:适用于Mac和iOS的异步套接字网络库-开源

    CocoaAsyncSocket为macOS,iOS和tvOS提供了易于使用且功能强大的异步套接字库。... 它完全在自己的GCD dispatch_queue中运行,并且是完全线程安全的。 此外,所有委托方法都异步调用到您选择的dispatch_queue上。

    详解iOS中多线程app开发的GCD队列的使用

     dispatch_queue_t queue=dispatch_get_main_queue(); (1)使用异步函数执行主队列中得任务,代码示例: 代码如下: // // YYViewController.m // 12-GCD的基本使用(主队列) // // Created by 孔医己 on 14-6...

    iOS实现手机获取验证码倒计时效果

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //创建一个定时器 _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); /

    iOS中多网络请求的线程安全详解

    前言 在iOS 网络编程有一种常见的场景是:我们需要并行处理二个请求并且在都成功后才能进行下一步处理。下面是部分常见的处理方式,但是在使用过程中也很容易出错: ... 同步 DispatchQueue:通过同步队列和 NSLoc

    iOS 多线程 GCD浅析

    切换到主线程队列,执行刷新操作 dispatch_async(dispatch_get_main_queue(), ^{ //主线程中执行UI刷新 imageView.image = image; });

Global site tag (gtag.js) - Google Analytics