GCD

来源:互联网 发布:mac版本支持远程控制 编辑:程序博客网 时间:2024/05/16 08:04

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,并且不能有参数。

0 0
原创粉丝点击