`

ios 多线程编程-GCD

    博客分类:
  • ios
阅读更多
Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行执行的线程池模式的基础上的。它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。
设计:
GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
一个任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行
dispatch queue分为下面三种:
Serial    
又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。
Concurrent
又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。
Main dispatch queue
它是全局可用的serial queue,它是在应用程序主线程上执行任务的。
我们看看dispatch queue如何使用
1、常用的方法dispatch_async
为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。
用GCD实现这个流程的操作比前面介绍的NSThread  NSOperation的方法都要简单。代码框架结构如下:
[cpp]
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 耗时的操作
    dispatch_async(dispatch_get_main_queue(), ^{
        // 更新界面
    });
});
如果这样还不清晰的话,那我们还是用上两篇博客中的下载图片为例子,代码如下:
[cpp]
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
    NSData * data = [[NSData alloc]initWithContentsOfURL:url];
    UIImage *image = [[UIImage alloc]initWithData:data];
    if (data != nil) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.imageView.image = image;
         });
    }
});
运行显示:

是不是代码比NSThread  NSOperation简洁很多,而且GCD会自动根据任务在多核处理器上分配资源,优化程序。
系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列,如下:
[cpp]
dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
这里也用到了系统默认就有一个串行队列main_queue
[cpp]
dispatch_queue_t mainQ = dispatch_get_main_queue();  
虽然dispatch queue是引用计数的对象,但是以上两个都是全局的队列,不用retain或release。
2、dispatch_group_async的使用
dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:
[cpp]
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, ^{
    [NSThread sleepForTimeInterval:1];
    NSLog(@"group1");
});
dispatch_group_async(group, queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@"group2");
});
dispatch_group_async(group, queue, ^{
    [NSThread sleepForTimeInterval:3];
    NSLog(@"group3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    NSLog(@"updateUi");
});
dispatch_release(group);
dispatch_group_async是异步的方法,运行后可以看到打印结果:
2012-09-25 16:04:16.737 gcdTest[43328:11303] group1
2012-09-25 16:04:17.738 gcdTest[43328:12a1b] group2
2012-09-25 16:04:18.738 gcdTest[43328:13003] group3
2012-09-25 16:04:18.739 gcdTest[43328:f803] updateUi
每个一秒打印一个,当第三个任务执行后,upadteUi被打印。

3、dispatch_barrier_async的使用
dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行
例子代码如下:
[cpp]
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:2];
    NSLog(@"dispatch_async1");
});
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:4];
    NSLog(@"dispatch_async2");
});
dispatch_barrier_async(queue, ^{
    NSLog(@"dispatch_barrier_async");
    [NSThread sleepForTimeInterval:4];

});
dispatch_async(queue, ^{
    [NSThread sleepForTimeInterval:1];
    NSLog(@"dispatch_async3");
});

打印结果:
2012-09-25 16:20:33.967 gcdTest[45547:11203] dispatch_async1
2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_async2
2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_barrier_async
2012-09-25 16:20:40.970 gcdTest[45547:11303] dispatch_async3
请注意执行的时间,可以看到执行的顺序如上所述。
4、dispatch_apply
执行某个代码片段N次。
dispatch_apply(5, globalQ, ^(size_t index) {
    // 执行5次
});
分享到:
评论

相关推荐

    iOS 多线程编程指南 pdf

    iOS多线程编程指南是一份深入介绍iOS平台下多线程编程技术的文档。文档主要涵盖的技术点包括NSThread、NSOperation以及Grand Central Dispatch(GCD),这些技术是iOS开发者在开发应用程序时常用的技术。 首先,...

    iOS多线程-GCD(异步任务,线程锁)

    线程安全是多线程编程中必须考虑的问题。在GCD中,我们可以通过线程锁来保护共享资源,确保在任何时候只有一个线程访问。线程锁有两种主要类型:NSLock和OS_dispatch_semaphore(信号量)。NSLock是一种简单的互斥锁...

    iOS多线程编程指南(一)关于多线程编程 - 51CTO.COM1

    本文将作为iOS多线程编程指南的第一部分,深入探讨多线程的基本概念、常用技术以及最佳实践。 1. **多线程基础** 多线程是指在一个应用程序中同时执行多个独立的执行流,每个执行流被称为一个线程。在iOS中,多...

    ios 多线程编程指南

    iOS多线程编程指南所涉及的知识点涵盖了多线程编程在iOS平台的应用,包括线程概念、线程管理、RunLoop对象、线程同步等核心概念以及具体实现技术。鉴于文档内容丰富,这里将详细解读并阐述上述知识点。 ### 1. 线程...

    ios多线程编程

    iOS多线程编程是iOS开发中的一个重要技能,对于提升应用程序的性能和用户体验至关重要。在iOS平台上,多线程编程可以通过多种技术实现,包括NSThread、Grand Central Dispatch(GCD)、Operation Objects等。本文档...

    ios多线程开发的常用四种方式和基本使用

    本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...

    iOS多线程编程知多少 - 51CTO.COM1

    本文将深入探讨iOS多线程编程的主要知识点。 首先,我们要了解iOS中的多线程模型。主要有三种实现方式:NSOperationQueue、NSThread和GCD(Grand Central Dispatch)。GCD是苹果推出的一种高效、简洁的多线程管理...

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

    ### iOS多线程与GCD概述 在iOS开发中,多线程是一个非常重要的概念。通过多线程,我们可以利用多核处理器的优势,将不同任务分散到多个线程中执行,从而提高程序的响应速度和执行效率。GCD(Grand Central Dispatch...

    iOS多线程编程指南(二)线程管理 - 51CTO.COM1

    在iOS开发中,多线程编程是不可或缺的一部分,它能够帮助开发者实现应用的高效执行,尤其是在处理耗时操作时,如网络请求、大数据计算等。本文将深入探讨iOS中的线程管理,帮助开发者理解如何优雅地处理多线程任务。...

    iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    ### iOS多线程编程技术详解:NSThread、Cocoa NSOperation、GCD #### 一、多线程基本概念 1. **进程**:在移动设备(如iPhone)上,每一个应用程序都可以被视为一个独立的进程。每个进程都会有一个主线程(main ...

    多线程编程指南

    本指南旨在为iOS开发者提供一个多线程编程的全面介绍。多线程是现代操作系统中的一个重要特性,它允许应用程序同时执行多个任务,从而提高效率并充分利用计算资源。在iOS开发中,合理利用多线程不仅能够提升应用性能...

    iOS 多线程编程指南 中文版

    ### iOS多线程编程指南知识点概述 #### 一、多线程编程介绍 - **多线程的概念**:多线程是指在一个程序中同时运行多个线程的能力,这些线程可以独立执行不同的任务或者并行处理同一任务的不同部分。通过多线程,...

    IOS多线程编程的3种实现方法

    iOS中有以下3种多线程编程方法: NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue 1.NSThread 这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的...

    iOS多线程编程

    本文将深入探讨iOS中的多线程编程,包括GCD(Grand Central Dispatch)、NSOperation、NSThread的使用,以及异步和同步下载、Block的运用,以及ASIHttpRequest类库的使用。 首先,GCD是Apple推出的一种多线程解决...

    gcd多线程gcd-demo-master (1).zip

    在IT行业中,多线程是程序设计中的一个重要概念,特别是在...通过研究这个项目,开发者可以深入理解GCD的工作原理,提高自己的多线程编程技能,同时也能学习如何在实际项目中有效利用GCD来提升应用的性能和用户体验。

Global site tag (gtag.js) - Google Analytics