1. 程式人生 > >Objective C 高階進階— GCD佇列淺析(一)

Objective C 高階進階— GCD佇列淺析(一)

前邊已經介紹了GCD的基本概念,下邊來介紹一下GCD佇列的基本用法,以及一些其他注意的地方。

本文參考連結:https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

一:佇列的幾種型別:

GCD offers three kinds of queues:

Main: tasks execute serially on your application’s main thread(主佇列,在你程式的主執行緒中順序執行)
Concurrent: tasks are dequeued in FIFO order, but run concurrently and can finish in any order.(並行佇列,任務遵循先入先出,但同時執行並按照任意順序完成,完成順序取決於任務的複雜度)
Serial: tasks execute one at a time in FIFO order(序列佇列,依次執行,遵循先入先出)


二:向主佇列註冊block函式

The main queue is automatically created by the system and associated with your application’s main thread. 
Your application uses one (and only one) of the following three approaches to invoke blocks submitted to the main queue:

Calling dispatch_main
Calling UIApplicationMain (iOS) or NSApplicationMain (OS X)
Using a CFRunLoopRef on the main thread


詳解: 主佇列是由系統自動建立的並且與你應用的主執行緒相結合,你的應用只能用下邊的一種方式來把block函式註冊到你的主佇列中。到這裡大家可能不太理解者到底怎麼用呢,下邊來看例項程式碼
@autoreleasepool {
        return UIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));
    }

注意,這裡是用到的就是UIApplicationMain方式,對於iOS要用這種方式
Important: GCD is a C level API; it does not catch exceptions generated by higher level languages. Your application must catch all exceptions before returning from a block submitted to a dispatch queue.

注意:GCD的介面是基於C的,它並不能捕捉到有高級別語言產生的exceptions, 你的應用必須在執行把block函式提交到佇列之前捕捉所有的異常。 三. 佇列使用的相關程式碼 建立一個佇列
dispatch_queue_t myQueue = dispatch_queue_create("com.openJailBreak.ios", NULL)
此處要注意的是,第一個引數是一個identifier,用於表示一個佇列,關鍵的是第二個引數,先來看官方原文:
attr
In OS X v10.7 and later, specify DISPATCH_QUEUE_SERIAL (or NULL) to create a serial queue or specify DISPATCH_QUEUE_CONCURRENT to create a concurrent queue. In earlier versions of OS X, you must specify NULL for this parameter.
意思是,如果第二個引數設定為DISPATCH_QUEUE_SERIAL或者NULL,意味著建立了一個序列佇列,如果指定一個DISPATCH_QUEUE_CONCURRENT意味著建立了一個並行佇列。在早期的版本中並行佇列是不可用的,需要設定為NULL,從OS X10.7,iOS 4.3以後才可用,先來看一下官方介面文件:
/*!
 * @const DISPATCH_QUEUE_SERIAL
 * @discussion A dispatch queue that invokes blocks serially in FIFO order.
 */
#define DISPATCH_QUEUE_SERIAL NULL

/*!
 * @const DISPATCH_QUEUE_CONCURRENT
 * @discussion A dispatch queue that may invoke blocks concurrently and supports
 * barrier blocks submitted with the dispatch barrier API.
 */
#define DISPATCH_QUEUE_CONCURRENT \
		DISPATCH_GLOBAL_OBJECT(dispatch_queue_attr_t, \
		_dispatch_queue_attr_concurrent)
__OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_3)
DISPATCH_EXPORT

好了,到這裡我們就該清楚了,現在來用三種方式來建立一個佇列
dispatch_queue_t queue_t_concurrent = dispatch_queue_create("com.openJailBreak.concurrent", DISPATCH_QUEUE_CONCURRENT);//concurrent
dispatch_queue_t queue_t_serial = dispatch_queue_create("com.openJailBreak.serial", DISPATCH_QUEUE_SERIAL);//serial
dispatch_queue_t queue_t_null = dispatch_queue_create("com.openJailBreak.null", NULL); //serilal

下邊進入討論議題,來看原文:
Discussion

Blocks submitted to a serial queue are executed one at a time in FIFO order. Note, however, that blocks submitted to independent queues may be executed concurrently with respect to each other. Blocks submitted to a concurrent queue are dequeued in FIFO order but may run concurrently if resources are available to do so.

When your application no longer needs the dispatch queue, it should release it with the  function. Any pending blocks submitted to a queue hold a reference to that queue, so the queue is not deallocated until all pending blocks have completed.

相信大家都能理解這裡的重點,此處還是要強調一下:

只有提交到序列佇列的block函數出佇列時才會FIFO,而對於獨立的佇列可能會並行執行。提交到並行佇列的block出隊時也是FIFO,但是在執行的過程中可能會根據系統的資源來並行執行。

當你的應用不在需要佇列時,可以使用dispatch_release來釋放,但如果佇列中又任何pending狀態的block,此時是無法dealloc的直到pending block完成。

好了,第一部分就先講到這裡吧,後續會繼續釋出,感謝大家!

相關推薦

Objective C 高階GCD佇列淺析()

前邊已經介紹了GCD的基本概念,下邊來介紹一下GCD佇列的基本用法,以及一些其他注意的地方。 本文參考連結:https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_li

Objective C 高階GCD佇列淺析(二)

前邊講解了如何建立GCD佇列,下邊接著來講解如何執行一個佇列, 請看官方原文 dispatch_async Submits a block for asynchronous execution on a dispatch queue and returns immedia

C++高階 第一季:const 詳解

零、文章來由 打算將基礎知識在看書的同時系統的整理一下,方便大家也方便自己。整理的知識儘量參照書本知識,比網上獲取的資料有更高的可信度。 一、從 文字常量和常變數 開始 1、文字常量 程式中的特殊識別符號或表示式,由於同時滿足: (1)不可

Android高階——繪圖篇()Canvas基本操作

開篇 前面在介紹 onDraw 過程時,有提到 View 的繪製(Canvas 的使用),後續的幾篇會詳細的介紹有關 Canvas 以及 Paint 的相關操作。 Canvas 和 Paint Canvas 和 Paint 之間的關係就像我們平時畫畫需要的

Objective-C高階程式設計讀書筆記之GCD

Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 Grand Central Dispatch (GCD) 目錄 什麼是GCD 什麼是多執行緒, 併發 GCD的優勢 GCD的API介紹 GCD的注意點 GCD的使用場景 Dispatch Sou

c# MEF框架(四 MEF高階

轉自:http://www.cnblogs.com/yunfeifei/p/3991330.html 好久沒有寫部落格了,今天抽空繼續寫MEF系列的文章。有園友提出這種系列的文章要做個目錄,看起來方便,所以就抽空做了一個,放到每篇文章的最後。 前面四篇講了MEF的基礎

c語言day_01

arr 1.3 求反 分享圖片 asc 命令 ali 加減 命令行參數 數據類型 1.1內存 內存是線性的,按照字節為單位進行編址的(8b) 1.2補碼 補碼特點(互逆): 0的補碼是0 符號位同普通位一起參與運算 補碼可以使加減乘除都變成加法 8位數據(

C語言——有符號與無符號02

開始 有符號 分析 ack 方式 pri 位運算 運算 pan 在計算機的內部,我們所有的信息都是由二進制數字組成的 有符號數的表實法: 在計算機內部用補碼的方式表實有符號數 正數的補碼位正數的本身 負數的補碼為其絕對值取反然後加一得到 例如-7 他在計算機內部的是11

C語言——循環語句07

tin 主題 sizeof -- 初始化 cas 通過 程序 erro 循環語句的基本工作方式: 通過條件表達式判定是否執行循環體 條件表達式遵循if語句表達式的原則 do,while,for的區別: do語句先執行後判斷,循環體至少執行一次 while語句先判斷後執

C語言——enum, sizeof, typedef 分析11

def 進階 new %d 計算 void var ray 枚舉類型 枚舉類型的使用方法: enum是C語言的 一種自定義類型 enum值是可以根據需要自定義的整型值 第一個enum的值默認為0 默認情況下的enum值是在前一個定義值的基礎上加 1 enum類型的變量

Objective-C高階程式設計:iOS與OS X多執行緒和記憶體管理

這篇文章主要給大家講解一下GCD的平時不太常用的API,以及文末會貼出GCD定時器的一個小例子。 需要學習的朋友可以通過網盤免費下載pdf版 (先點選普通下載-----再選擇普通使用者就能免費下載了)http://putpan.com/fs/cy1i1beebn7s0h4u9/ 1.G

Android高階之自定義View

前言 在網上看到一張圖,花了些時間自己嘗試著寫了一個自定義View,裡面涉及到了自定義屬性、自定義View padding屬性的處理、畫筆(Paint)和畫布(Canvas)的使用、解析度適配問題、效能問題、屬性動畫等,覺得還是有些東西值的記錄一下的,效果圖如下: 自定義屬

C++模板指南:SFINAE

C++模板進階指南:SFINAE 空明流轉(https://zhuanlan.zhihu.com/p/21314708) SFINAE可以說是C++模板進階的門檻之一,如果選擇一個論題來測試對C++模板機制的熟悉程度,那麼在我這裡,首選就應當是SFINAE機制。 我們不用糾結這個詞的發音,它來自於 Su

Java效能優化高階

目錄$ b& Z7 N" v3 B├─1 什麼是效能優化2 w5 O/ k6 p- D+ q│  ├─1.1效能優化專題-什麼是效能優化一-.mp4│  ├─1.1效能優化專題-什麼是效能優化二-.mp4│  ├─效能優化.pdf/

Redis高階(二)

一、訊息通知 在一些網站上,經常會有一些釋出/訂閱或者郵件訂閱的功能,尤其一些部落格上。其實這種問題很常見,當頁面需要進行如傳送郵件、複雜的計算時會阻塞頁面的渲染。為了避免使用者等待太久,應該使用其他程序單獨完成此類操作,這裡郵件訂閱可以用任務佇列來實現,具體來說,當需要傳送郵件時,將其存入佇列中,另外一個

Redis高階

一、redis中的事務 在關係型資料庫中事務是必不可少的一個核心功能,生活中也是處處可見,比如我們去銀行轉賬,首先需要將A賬戶的錢划走,然後存到B賬戶上,這兩個步驟必須在同一事務中,要麼都執行,要麼都不執行,不然錢憑空消失了,換了誰也無法接受。 同樣,redis中也為我們提供了事務,原理是:先把一組同一事

Android高階ToolBar

我記得之前Android4.0的時候是actionBar,到了Android5.0以後google新出了ToolBar用以彌補ActionBar的不足。今天我們就來講一下 ToolBar的用法。其實現在Android系統的UI設計有些已經超越了IOS... 一、基本用法 1. 我們新建立一個

python pandas高階

這是要匯入的模組 一、資料規整化 – 合併資料集 pd.merge :連線dataframe的行,實現的是資料庫的連線操作 concat: 沿一條軸將多個物件堆疊到一起 combine_first:可以將重複資料編接在一起,用一個物件中的值填充另一個物件中的缺失

C++11知識列表

型別轉換:to_string() 智慧指標: shared_ptr        《C++ Primer》 shared_ptr示例:單詞搜尋 1 適合放到容器中 unique_ptr 1 替代了原來的auto_ptr 3

【玩轉資料結構 從入門到佇列

package Arr; /** * 陣列佇列 * @author 大南海 * * @param <E> */ public class ArrayQueue<E> implements Queue<E> { private Array<E