iOS應用程序中通過dispatch隊列控制線程執(zhí)行的方法
GCD編程的核心就是dispatch隊列,dispatch block的執(zhí)行最終都會放進某個隊列中去進行,它類似NSOperationQueue但更復雜也更強大,并且可以嵌套使用。所以說,結(jié)合block實現(xiàn)的GCD,把函數(shù)閉包(Closure)的特性發(fā)揮得淋漓盡致。
dispatch隊列的生成可以有這幾種方式:
1. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.serial", DISPATCH_QUEUE_SERIAL); //生成一個串行隊列,隊列中的block按照先進先出(FIFO)的順序去執(zhí)行,實際上為單線程執(zhí)行。第一個參數(shù)是隊列的名稱,在調(diào)試程序時會非常有用,所有盡量不要重名了。
2. dispatch_queue_t queue = dispatch_queue_create("com.dispatch.concurrent", DISPATCH_QUEUE_CONCURRENT); //生成一個并發(fā)執(zhí)行隊列,block被分發(fā)到多個線程去執(zhí)行
3. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //獲得程序進程缺省產(chǎn)生的并發(fā)隊列,可設(shè)定優(yōu)先級來選擇高、中、低三個優(yōu)先級隊列。由于是系統(tǒng)默認生成的,所以無法調(diào)用dispatch_resume()和dispatch_suspend()來控制執(zhí)行繼續(xù)或中斷。需要注意的是,三個隊列不代表三個線程,可能會有更多的線程。并發(fā)隊列可以根據(jù)實際情況來自動產(chǎn)生合理的線程數(shù),也可理解為dispatch隊列實現(xiàn)了一個線程池的管理,對于程序邏輯是透明的。
官網(wǎng)文檔解釋說共有三個并發(fā)隊列,但實際還有一個更低優(yōu)先級的隊列,設(shè)置優(yōu)先級為DISPATCH_QUEUE_PRIORITY_BACKGROUND。Xcode調(diào)試時可以觀察到正在使用的各個dispatch隊列。
4. dispatch_queue_t queue = dispatch_get_main_queue(); //獲得主線程的dispatch隊列,實際是一個串行隊列。同樣無法控制主線程dispatch隊列的執(zhí)行繼續(xù)或中斷。
線程操作示例
為了方便地使用GCD,蘋果提供了一些方法方便我們將block放在主線程或后臺線程執(zhí)行,或者延后執(zhí)行。使用的例子如下所示:
// 后臺執(zhí)行:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// something
});
// 主線程執(zhí)行:
dispatch_async(dispatch_get_main_queue(), ^{
// something
});
// 一次性執(zhí)行:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once
});
// 延遲2秒執(zhí)行:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
dispatch_queue_t也可以自己定義,如要自定義queue,可以用dispatch_queue_create方法,示例如下:
// 自定義dispatch_queue_t
dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL);
dispatch_async(urls_queue, ^{
// your code
});
dispatch_release(urls_queue);
另外,GCD還有一些高級用法,例如讓后臺兩個線程并行執(zhí)行,然后等兩個線程都結(jié)束后,再匯總執(zhí)行結(jié)果。這個可以用dispatch_group_t、dispatch_group_async、dispatch_group_notify來實現(xiàn),示例如下:
// 合并匯總結(jié)果
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行執(zhí)行的線程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行執(zhí)行的線程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 匯總結(jié)果
});
dispatch隊列不支持cancel(取消),沒有實現(xiàn)dispatch_cancel()函數(shù),不像NSOperationQueue,不得不說這是個小小的缺憾。
相關(guān)文章
iOS 報clang: error: no input files錯誤的解決方法
這篇文章主要給大家介紹了關(guān)于iOS報clang: error: no input files錯誤的解決方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-01-01iOS開發(fā)實現(xiàn)搜索框(UISearchController)
這篇文章主要為大家詳細介紹了iOS開發(fā)實現(xiàn)搜索框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08iOS應用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)
AFNetworking庫是Objective-C語言寫成的用于處理HTTP的第三方庫,在GitHub上開源并且一直在被更新和維護,下面就一起來看一下iOS應用開發(fā)中AFNetworking庫的常用HTTP操作方法小結(jié)2016-05-05iOS利用AVPlayer播放網(wǎng)絡(luò)音樂的方法教程
最近工作中遇到了一個需求,需要做一個在線音樂類的APP,通過一段時間的努力實現(xiàn)了,所以這篇文章主要給大家介紹了關(guān)于iOS利用AVPlayer播放網(wǎng)絡(luò)音樂的方法教程,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05