`
linwwwei
  • 浏览: 222747 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

GCD和块对象介绍

 
阅读更多
GCD的核心,是一些全局并发队列,它们可以被用dispatch_get_global_queue函数访问:
dispatch_queue_t dispatchQueue =
            dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
方法的第一个参数是调度队列的优先级。第二个参数保留,当前必须设0。队列的优先级越高,(在理想情况下)其中的任务就会被越快地执行。第一个参数可以传递的值有:
    DISPATCH_QUEUE_PRIORITY_HIGH:高优先级。
    DISPATCH_QUEUE_PRIORITY_DEFAULT:中优先级。
    DISPATCH_QUEUE_PRIORITY_LOW:低先级。
    DISPATCH_QUEUE_PRIORITY_BACKGROUND:最低的优先级。
除了全局并发队列,还可以使用main queue。每个应用程序最多拥有一个主队列。主队列和全局并发队列之间的不同是,主队列永远在主线程执行代码,而全局并发队列对代码的执行依赖于系统的决定和由GCD创建与管理的各种其它线程。
为了获取应用程序的主队列,必须如下使用dispatch_get_main_queue函数:
        dispatch_queue_t mainQueue = dispatch_get_main_queue();
        /* Dispatch tasks to the queue */
现在,我们知道了如何取得全局并发队列和主队列的句柄。但问题是:我们如何在这些队列执行一段代码呢?答案很简单:使用某个dispatch_过程。下面是其中的几种口味:
    dispatch_sync:提交块对象给指定的调度队列,同步执行。
    dispatch_async:提交块对象给指定的调度队列,异步执行。
    dispatch_once:提交块对象给指定的调度队列,在应用程序有效期中仅执行一次。调用相同的方法,传递相同的块对象给任何调度队列都将立即返回,而不会再次执行块对象。
dispatch_sync过程在全局并发队列中执行我们的块对象,这意味着块对象将在主线程以外的其他线程中被执行。同时,由于dispatch_sync过程的天性,代码的执行将阻塞并发队列直至其完成。然后第二个同步调度发生,依此类推;直至我们先要给用户显示消息的地方。在这个情况下,我们在主队列中执行我们的块对象,因为所有的UI相关代码(显示、隐藏,向窗口添加视图等)需要在主线程中执行。

   我们还应当看看先前讨论过的dispatch_once过程。该过程在指定的调度队列中执行块对象,在应用程序生存期中,仅执行一次。使用dispatch_once过程时,必须注意几件事:
      1. 本过程会阻塞。换句话说,它是同步的,它将阻塞其所运行于的调度队列直至代码执行完全。
      2. 和dispatch_sync、dispatch_async不同,本过程没有使用一个调度队列作为参数。默认情况下,它将在当前的调度队列执行任务。
调用dispatch_get_current_queue函数获得当前的调度队列。

     3. 本过程的第一个参数是dispatch_once_t类型的指针。这是本过程保持追踪哪些块要执行、哪些块不要执行的方式。举例来说,如果你调用本过程,为该参数传入两个不同的指针,但传入的是完全相同的块对象,那么,块对象将被执行两次,因为传入的两个指针指向不同的内存块。
     4. 本过程的第二个参数是要被执行的块对象。该块对象必须返回void,并且不能有参数。
分享到:
评论

相关推荐

    代理delegate详解,block,gcd

    在iOS和Mac开发中,代理(Delegate)、Block和GCD(Grand Central Dispatch)是三个非常重要的概念,它们各自承担着不同的任务,同时也常被结合使用以实现高效的代码编写。下面将详细阐述这三个知识点。 首先,代理...

    iOS GCD开发总结整理

    GCD通过Block(代码块)来定义任务,这样可以使得代码更加简洁和易于理解。 ```swift dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // ...

    iOS中GCD在多线程方面的理解

    虽然两者都能实现多线程,但GCD更底层,提供更强大的控制,而NSOperationQueue则更面向对象,易于理解和使用,提供了更多的高级功能,如依赖关系、取消任务等。 总结,GCD在iOS开发中扮演着重要的角色,通过合理地...

    GCD实战二:资源竞争 - 51CTO.COM1

    GCD提供了一些机制来解决这些问题,如串行队列和同步块。 1. **串行队列**:串行队列确保同一时间只有一个任务在执行,因此可以避免资源竞争。开发者可以通过`dispatch_queue_create()`创建一个串行队列,并使用`...

    IOS GCD 多线程

    4. **注意内存管理**:在GCD中,任务会自动释放,但需要注意的是,如果在任务中创建的对象需要在任务外使用,需考虑引用计数的问题。 总结,GCD作为iOS开发中的多线程解决方案,通过其强大的队列和任务调度机制,让...

    ios-简易了解GCD的单例模式.zip

    `dispatch_once`是GCD提供的函数,保证某个代码块只执行一次,适用于初始化单例;`@synchronized`则是Objective-C的关键字,用于同步访问某个对象,防止多线程环境下的数据竞争问题。 2. **懒加载**:为了优化性能,...

    Pro Multithreading and Memory Management for iOS and OS X

    本书详细介绍了自动引用计数(ARC)、Grand Central Dispatch(GCD)和闭包(Blocks)等技术,并向读者展示了如何利用这些技术来管理和开发并发应用程序。 在多线程和内存管理方面,本书的主要知识点包括: 1. ...

    Objective-C 高级编程:iOS与OS X多线程和内存管理【英文版】

    本书重点介绍了自动引用计数(ARC)、Grand Central Dispatch(GCD)和Blocks的相关技术,并给出了在并发环境下开发响应迅速的iOS和OS X应用程序所需的知识和技能。 首先,内存管理是任何编程语言中的一个基础而...

    基于Objective-C的面向对象编程

    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将程序设计中的实体抽象为对象,通过对象来实现数据和行为的封装、继承和多态性。Objective-C是苹果公司开发的一种面向对象的编程语言,它...

    Concurrent Programming in Mac OS X and iOS

    块对象是C语言的一个扩展特性,它允许创建可调用的代码块,这些代码块可以作为函数参数传递或存储在数据结构中。块对象为实现并行处理提供了一种灵活的方式。 1. **构造与语法**:块对象的定义通常包含一个`^`符号...

    Async:在PPL和GCD的启发下进行任务级并行性实验

    2. **任务创建**:使用PPL的`task`类或者GCD的块语法创建任务对象。 3. **任务调度**:选择合适的调度策略,如PPL的`concurrency::parallel_for_each`或GCD的`dispatch_async`,将任务提交到执行线程。 4. **任务...

    IOS并发编程指南

    《iOS并发编程指南》是一份详尽地介绍在苹果操作系统中进行多线程和并发编程的指南。该文档着重解释了在iOS平台,开发者如何通过利用Apple提供的并发编程模型,包括Grand Central Dispatch (GCD) 和 Operation ...

    Pro Multithreading and Memory Management for iOS

    - **GCD基础**:第六章介绍了GCD的基本概念,包括队列(Queue)和同步/异步操作。这为读者提供了构建高效并发应用程序所需的基础知识。 - **GCD实现**:第七章重点讨论了GCD的具体实现细节,包括如何使用GCD进行资源...

    Objective-C程序设计 第6版 完整版 0分奉上

    从基础的语法结构开始,包括类、对象、消息传递,到更高级的主题,如协议、分类、块和GCD(Grand Central Dispatch),以及苹果的Cocoa和Cocoa Touch框架。这些内容是构建高效、可维护的iOS和macOS应用程序的基础。 ...

    Objective-C高级编程iOS与OS X多线程和内存管理(英文版)

    GCD还提供了barrier、group和semaphore等机制,帮助开发者更好地控制并发执行的顺序和同步。 在iOS和OS X开发中,理解和熟练运用多线程技术是提高应用性能和用户体验的关键。通过GCD,开发者可以创建后台任务,避免...

    iOS中多线程原理与runloop介绍

    它提供了丰富的API来创建线程和执行异步任务,并且支持块(Block)语法。 - **示例**:例如,可以在全局队列中异步下载一张大图片,代码如下所示: ```swift dispatch_queue_t imageDownloadQueue = dispatch_...

    2022年最新iOS面试题附答案.docx

    值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的指向。因此,类和结构体的主要区别在于它们的存储和操作方式。类是在堆(heap)上存储的,而结构体是在栈(stack)上存储的。 类有以下几个功能: ...

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

    GCD是苹果引入的一种基于C的并发编程框架,它基于块(Block)语法,简化了多线程编程。GCD通过队列(Dispatch Queue)来管理并发,分为串行队列和并行队列。串行队列保证了操作的顺序执行,而并行队列则可以并发执行...

    编写苹果游戏中心应用程序

    为了更高效地管理异步操作,GameKit使用了块对象(block objects)和Grand Central Dispatch (GCD)。块对象是一种灵活的数据结构,可以作为函数参数传递,并在适当的时候执行。GCD则是一个多核编程模型,用于调度任务...

Global site tag (gtag.js) - Google Analytics