`

GCD之Dispatch Queue

阅读更多

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.

分享到:
评论

相关推荐

    并发编程之Operation Queue和GCD

    并发编程之Operation Queue和GCD Operation Queue是一个面向对象的并发编程接口,它支持并发数、线程优先级、任务优先级、任务依赖关系等多种配置,可以方便满足各种复杂的多任务处理场景。 GCD(Grand Central ...

    ios demo,dispatch_async,DISPATCH_QUEUE_CONCURRENT,多任务并发执行,自动创建多线程

    压缩包中的`test_gcd_thread_asynchronous_concurrent`可能是一个测试项目,包含了一些用于演示`dispatch_async`和`DISPATCH_QUEUE_CONCURRENT`使用的代码文件。在这个项目中,开发者可能可以看到如何创建并行队列、...

    gcdTest下载图片 dispatch_async

    dispatch_queue_t是GCD的核心,分为串行队列(serial queue)和并行队列(concurrent queue)。串行队列一次只执行一个任务,而并行队列则可以同时处理多个任务。在iOS中,有全局并行队列和主队列两种。全局并行队列...

    Cocoa多线程编程之 block 与 dispatch quene

    苹果的Grand Central Dispatch (GCD) 提供了dispatch queue,用于调度block在不同的线程上执行。主要有两种类型的dispatch queue:串行队列(serial queue)和并行队列(concurrent queue)。 1. 串行队列:每个...

    iOS GCD多核编程

    let queue = DispatchQueue.global(qos: .background) queue.async { // 在这里执行耗时操作,如下载数据 // ... // 完成后更新UI,但必须回到主线程 DispatchQueue.main.async { // 更新UI } } ``` 四、...

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

    在iOS开发中,Grand Central Dispatch (GCD) 是一种强大的多线程管理工具,它能够帮助开发者高效地处理并发任务。本篇文章主要讨论了如何深入理解GCD中的dispatch_group、dispatch_barrier以及基于线程安全的多读单...

    iOS-常驻线程之线程循环调用(两个线程循环交替调用)

    let queue1 = DispatchQueue(label: "thread1", qos: .background, attributes: .concurrent) let queue2 = DispatchQueue(label: "thread2", qos: .background, attributes: .concurrent) let timerSource = ...

    iOS GCD详解

    Dispatch Queues是GCD的基本概念,dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。GCD中有三种队列类型: 1. 主队列(main queue):与主线程...

    ios gcd

    在iOS开发中,Grand Central Dispatch(GCD)是苹果公司提供的多线程解决方案,它极大地简化了并发编程。GCD是基于C语言的API,但同时也很好地与Objective-C和Swift兼容。这篇博客文章《ios gcd》可能深入探讨了如何...

    Constructing your own 地上爬梯好次 queues with GCD

    DispatchQueue.global(qos: .userInteractive) // 最高优先级 DispatchQueue.global(qos: .userInitiated) // 默认优先级 DispatchQueue.global(qos: .utility) // 较低优先级 DispatchQueue.global(qos: ....

    iOS GCD 多线程

    全局队列具有四种优先级:`DISPATCH_QUEUE_PRIORITY_HIGH`、`DISPATCH_QUEUE_PRIORITY_DEFAULT`、`DISPATCH_QUEUE_PRIORITY_LOW` 和 `DISPATCH_QUEUE_PRIORITY_BACKGROUND`。虽然自定义队列本身不支持直接设置优先级...

    多线程GCD,NSThread,NSOperationQueue,详细解释Demo

    例如,可以使用`DispatchQueue.main.async`、`-[NSThread performSelectorOnMainThread:]`或`-[NSOperationQueue addOperationWithBlock:]`。 综上所述,GCD、NSThread和NSOperationQueue各有优缺点,选择哪种取决...

    GCD基本概念

    GCD的核心概念和特性包括Dispatch Queue、Dispatch Source、以及高效的内存管理机制。 ### GCD基本概念与特性 1. **GCD与NSOperationQueue的对比:** GCD和NSOperationQueue都可以将任务分解并排队,从而并发或...

    iOS GCD 开发教程 完整版

    在Swift中,GCD的API被封装在`DispatchQueue`类中,使用更加简洁。例如,创建并行队列并提交异步任务: ```swift let globalQueue = DispatchQueue.global(qos: .background) globalQueue.async { // 异步执行的...

    GCD封装成面向对象

    private let queue: DispatchQueue init(queueType: QueueType) { if queueType == .serial { queue = DispatchQueue(label: "com.example.serialQueue", attributes: .serial) } else { queue = Dispatch...

    iOS 多线程总结之GCD的使用详解

    dispatch_queue_t concurrentQueue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT); ``` 还可以使用dispatch_get_global_queue获取全局并行队列,一般传入DISPATCH_QUEUE_PRIORITY_DEFAULT作为...

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

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

    gcd简介及应用实例及实例分析.txt

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行任务 }); ``` 2. **创建本地串行队列**: ```swift dispatch_queue_t queue ...

    GCD使用的相关方法

    - **Dispatch Queue**:调度队列是GCD的核心,用于管理任务的执行。主要有两种类型:串行队列(Serial Queue)和并行队列(Concurrent Queue)。串行队列一次仅执行一个任务,而并行队列则可以同时处理多个任务。 ...

Global site tag (gtag.js) - Google Analytics