iOS GCD

from:http://www.cnblogs.com/dsxniubility/p/4296937.html

?

一般:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{// 耗時操作dispatch_async(dispatch_get_main_queue(), ^{// 更新UI
        });});

?

?

本文是對以往學習的多線程中知識點的一個整理。

多線程中的隊列有:串行隊列,并發隊列,全局隊列,主隊列

執行的方法有:同步執行和異步執行。那么兩兩一組合會有哪些注意事項呢?

如果不是在董鉑然博客園看到這邊文章請?點擊查看原文

提到多線程,也就是四種,pthread,NSthread,GCD,NSOperation ?

其中phtread是跨平臺的。GCD和NSOperation都是常用的,后者是基于前者的。

但是兩者區別:GCD的核心概念是將一個任務添加到隊列,指定任務執行的方法,然后執行。 NSOperation則是直接將一個操作添加到隊列中。

為了整體結構更加清晰,我是用GCD來做此排列組合的實驗。實驗主要是通過循環內打印和主線程的打印先后順序來判斷結果,最后再加以總結

1.串行隊列,同步執行

1
2
3
4
5
6
7
8
9
10
dispatch_queue_t q = dispatch_queue_create("dantesx",?NULL);
// 執行任務
for?(int?i = 0; i<10; i++) {
????dispatch_sync(q, ^{
????????NSLog(@"%@ %d", [NSThread?currentThread], i);
????});
}
NSLog(@"董鉑然 come here");

運行效果:

?

執行結果可以清楚的看到全在主線程執行,并且是按照數序執行,循環結束之后主線程的打印才輸出。

2.串行隊列,異步執行

1
2
3
4
5
6
7
8
9
dispatch_queue_t q = dispatch_queue_create("dantesx",?NULL);
for?(int?i = 0; i<10; i++) {
????dispatch_async(q, ^{
????????NSLog(@"%@ %d", [NSThread?currentThread], i);
????});
}
//??? [NSThread sleepForTimeInterval:0.001];
NSLog(@"董鉑然 come here");

?運行結果

結果顯示,系統開了1條異步線程,因此全部在線程2執行,并且是順序執行。主線程打印雖然在最上面,但是這個先后順序是不確定,如果睡個0.001秒,主線程的打印會混在中間。

3.并發隊列,異步執行

1
2
3
4
5
6
7
8
9
10
11
// 1. 隊列
dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);
// 2. 異步執行
for?(int?i = 0; i<10; i++) {
????dispatch_async(q, ^{
????????NSLog(@"%@ %d", [NSThread?currentThread], i);
????});
}
//??? [NSThread sleepForTimeInterval:2.0];
NSLog(@"董鉑然 come here");

?運行結果

結果顯示,主線程的打印還是混在中間不確定的,因為異步線程就是誰也不等誰。系統開了多條線程,并且執行的順序也是亂序的

?

4.并發隊列,同步執行

1
2
3
4
5
6
7
8
9
10
11
// 1. 隊列
dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);
// 2. 同步執行
for?(int?i = 0; i<10; i++) {
????dispatch_sync(q, ^{
????????NSLog(@"%@ %d", [NSThread?currentThread], i);
????});
}
//??? [NSThread sleepForTimeInterval:2.0];
NSLog(@"董鉑然 come here");

?運行結果

這個運行結果和第1種的串行隊列,同步執行是一模一樣的。 因為同步任務的概念就是按順序執行,后面都要等。言外之意就是不允許多開線程。 同步和異步則是決定開一條還是開多條。

所以一旦是同步執行,前面什么隊列已經沒區別了。

5.主隊列,異步執行

1
2
3
4
5
6
7
8
9
10
11
// 1. 主隊列 - 程序啟動之后已經存在主線程,主隊列同樣存在
dispatch_queue_t q = dispatch_get_main_queue();
// 2. 安排一個任務
for?(int?i = 0; i<10; i++) {
????dispatch_async(q, ^{
????????NSLog(@"%@ %d", [NSThread?currentThread], i);
????});
}
NSLog(@"睡會");
[NSThread?sleepForTimeInterval:2.0];
NSLog(@"董鉑然 come here");

?運行結果

結果顯示有點出人意料。主線程在睡會之后才打印,循環一直在等著。因為主隊列的任務雖然會加到主線程中執行,但是如果主線程里也有任務就必須等主線程任務執行完才輪到主隊列的。

6.主隊列,同步執行

1
2
3
4
5
6
7
8
9
dispatch_queue_t q = dispatch_get_main_queue();
NSLog(@"卡死了嗎?");
dispatch_sync(q, ^{
????NSLog(@"我來了");
});
NSLog(@"董鉑然 come here");

?運行結果為卡死

卡死的原因是循環等待,主隊列的東西要等主線程執行完,而因為是同步執行不能開線程,所以下面的任務要等上面的任務執行完,所以卡死。這是排列組合中唯一一個會卡死的組合。

7.同步任務的使用場景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);
// 1. 用戶登錄,必須要第一個執行
dispatch_sync(q, ^{
????[NSThread?sleepForTimeInterval:2.0];
????NSLog(@"用戶登錄 %@", [NSThread?currentThread]);
});
// 2. 扣費
dispatch_async(q, ^{
????NSLog(@"扣費 %@", [NSThread?currentThread]);
});
// 3. 下載
dispatch_async(q, ^{
????NSLog(@"下載 %@", [NSThread?currentThread]);
});
NSLog(@"董鉑然 come here");

?運行結果

結果顯示,“用戶登陸”在主線程打印,后兩個在異步線程打印。上面的“用戶登陸”使用同步執行,后面的扣費和下載都是異步執行。所以“用戶登陸”必須第一個打印出來不管等多久,然后后面的兩個異步和主線程打印會不確定順序的打印。這就是日常開發中,那些后面對其有依賴的必須要先執行的任務使用同步執行,然后反正都要執行先后順序無所謂的使用異步執行。

8.block異步任務包裹同步任務

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dispatch_queue_t q = dispatch_queue_create("dantesx", DISPATCH_QUEUE_CONCURRENT);
void?(^task)() = ^ {
????// 1. 用戶登錄,必須要第一個執行
????dispatch_sync(q, ^{
????????NSLog(@"用戶登錄 %@", [NSThread?currentThread]);
????});
????// 2. 扣費
????dispatch_async(q, ^{
????????NSLog(@"扣費 %@", [NSThread?currentThread]);
????});
????// 3. 下載
????dispatch_async(q, ^{
?????????
????????NSLog(@"下載 %@", [NSThread?currentThread]);
????});
};
dispatch_async(q, task);
[NSThread?sleepForTimeInterval:1.0];
NSLog(@"董鉑然 come here");

?運行結果

因為整個block是在異步執行的,所以即使里面“用戶登陸”是同步執行,那也無法在主線程中執行,只能開一條異步線程執行,因為是同步的所以必須等他先執行,后面的“扣費”和“下載”在上面同步執行結束之后,不確定順序的打印。

9.全局隊列

1
2
3
4
5
6
7
8
9
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
for?(int?i = 0; i < 10; i++) {
????dispatch_async(q, ^{
????????NSLog(@"%@ %d", [NSThread?currentThread], i);
????});
}
[NSThread?sleepForTimeInterval:1.0];
NSLog(@"com here");

?運行結果

全局隊列的本質就是并發隊列,只是在后面加入了,“服務質量”,和“調度優先級” 兩個參數,這兩個參數一般為了系統間的適配,最好直接填0和0。

如果不是在董鉑然博客園看到這邊文章請?點擊查看原文

總結:

1. 開不開線程,取決于執行任務的函數,同步不開,異步開。

2. 開幾條線程,取決于隊列,串行開一條,并發開多條(異步)

3. 主隊列:? 專門用來在主線程上調度任務的"隊列",主隊列不能在其他線程中調度任務!

4. 如果主線程上當前正在有執行的任務,主隊列暫時不會調度任務的執行!主隊列同步任務,會造成死鎖。原因是循環等待

5. 同步任務可以隊列調度多個異步任務前,指定一個同步任務,讓所有的異步任務,等待同步任務執行完成,這是依賴關系。

6.?全局隊列:并發,能夠調度多個線程,執行效率高,但是相對費電。 串行隊列效率較低,省電省流量,或者是任務之間需要依賴也可以使用串行隊列。

7. 也可以通過判斷當前用戶的網絡環境來決定開的線程數。WIFI下6條,3G/4G下2~3條。

轉載于:https://www.cnblogs.com/lucky-star-star/p/5787877.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++和java哪個難_2020 年 11 月編程語言排行榜,Python 超越 Java ?

來源&#xff1a;tiobe.com/tiobe-index/November-2020TIOBE 2020 年 11 月份的編程語言排行榜已經公布&#xff0c;官方的標題是&#xff1a;Python 勢如破竹&#xff0c;超越 Java。題外話: 目前小哈正在個人博客(新搭建的網站&#xff0c;域名就是犬小哈的拼音) www.quanxia…

C# 溫故而知新:Stream篇(七)

C# 溫故而知新&#xff1a;Stream篇&#xff08;七&#xff09; NetworkStream 目錄&#xff1a; NetworkStream的作用簡單介紹下TCP/IP 協議和相關層次簡單說明下 TCP和UDP的區別簡單介紹下套接字&#xff08;Socket&#xff09;的概念簡單介紹下TcpClient,TcpListener,IPEndP…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波7 - 直方圖處理 - 直方圖、歸一化直方圖

目錄直方圖處理直方圖處理 令rk,k0,1,2,…,L?1r_k, k0, 1, 2, \dots, L-1rk?,k0,1,2,…,L?1表于一幅LLL級灰度數字圖像f(x,y)f(x,y)f(x,y)的灰度。fff的非歸一化直方圖定義為&#xff1a; h(rk)nk,k0,1,2,…,L?1(3.6)h(r_{k}) n_{k}, \quad k 0, 1, 2, \dots, L-1 \tag{…

Xamarin Android提示找不到資源屬性定義

為什么80%的碼農都做不了架構師&#xff1f;>>> Xamarin Android提示找不到資源屬性定義 錯誤信息&#xff1a;”Resource.Attribute”未包含”actonBarSize”的定義 Xamarin Android經常會出現找不到資源屬性的錯誤。遇到這種問題&#xff0c;建議先清理解決方法和…

Google Chrome保存插件方法

1、拷貝下面地址到記事本 https://clients2.google.com/service/update2/crx?responseredirect&xid%3D~~~~%26uc 2、打開插件所在的頁面&#xff0c;拷貝插件地址到記事本 如&#xff1a;https://chrome.google.com/webstore/detail/axure-rp-extension-for-ch/dogkpdfckl…

java web項目_[適合初中級Java程序員修煉手冊從0搭建整個Web項目](二)

前言文本已收錄至我的GitHub倉庫&#xff0c;歡迎Star&#xff1a;https://github.com/bin392328206種一棵樹最好的時間是十年前&#xff0c;其次是現在six-finger-web一個Web后端框架的輪子從處理Http請求【基于Netty的請求級Web服務器】 到mvc【接口封裝轉發)】&#xff0c;再…

MapReduce操作HBase

運行HBase時常會遇到個錯誤&#xff0c;我就有這樣的經歷。 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times 檢查日志&#xff1a;org.apache.hadoop.ipc.RPC$VersionMismatch: Protocol org.apache.hadoop.hdfs.protocol.ClientProtocol versio…

轉 ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV)

ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV) 分類&#xff1a; SAP ABAP2013-01-31 09:58 1511人閱讀 評論(0) 收藏 舉報目錄 一、ALV簡介 1、簡介 2、ALV_GRID介紹 3、其它描述 二、開發ALV的基本流程 三、ALV相關開發細節 1、標準ALV與對象ALV的共同開發細節 2、標準…

MAC OS X 1.1 El Capitan安裝方法與步驟

2019獨角獸企業重金招聘Python工程師標準>>> 蘋果公司發布了最新的Mac系統El Capitan,我也跟風安裝了, 昨天試了一天終于算是安裝成功了. ###電腦配置: CPU: E3-1230 v2 主板: 技嘉B75M D3V 顯卡: 微星6850 聲卡: Realtek ALC887 鍵盤: Noppoo 84鍵機械鍵盤 ###下載…

vp與vs聯合開發-網口通信(socket)

Socket通信是一種在網絡中進行進程間通信的機制。它使用了一種稱為套接字&#xff08;Socket&#xff09;的編程接口&#xff0c;通過該接口可以創建、連接、發送和接收數據等操作。 Socket通信中&#xff0c;有兩個主要的角色&#xff1a;服務器和客戶端。服務器負責監聽指定…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波8 - 直方圖處理 - 直方圖均衡化(全局直方圖均衡化)

直方圖均衡化 灰度映射函數&#xff1a; sT(r),0≤r≤L?1(3.8)s T(r), \quad 0\leq r \leq L -1 \tag{3.8}sT(r),0≤r≤L?1(3.8) 假設&#xff1a; (1) T(r)T(r)T(r)在區間0≤r≤L?10 \leq{r} \leq{L-1}0≤r≤L?1 上是一個單調遞增函數。 (2) 對于0≤r≤L?10 \leq{r} …

python 元組和列表區別_Python干貨整理:一分鐘了解元組與列表使用與區別

元組是 Python 對象的集合&#xff0c;跟列表十分相似。下面進行簡單的對比。列表與元組1、python中的列表list是變量&#xff0c;而元組tuple是常量。列表&#xff1a;是使用方括號[]&#xff0c;元組&#xff1a;則是使用圓括號()2、兩者都可以使用索引讀取值列表1.列表中的a…

JS拖拽,移動與拉伸

上次做的簡單的拖拽&#xff1a;javascript簡單拖拽練習(鼠標事件 mousedown mousemove mouseup) 這次增加了一些相關的功能&#xff0c;增加四個角的拉伸改變寬度&#xff0c;主要還是用到一些簡單的坐標位置計算&#xff0c;沒有什么技術難度&#xff0c;熟練了一下自己對拖拽…

關于release后retainCount還是1的問題

轉自&#xff1a;http://www.cocoachina.com/bbs/read.php?tid175523 realse之后再調用還能調用的的問題&#xff0c;我做了這么多年也是經常遇到&#xff0c;也曾經試圖尋找原因&#xff0c; 就像6樓說的&#xff0c;很多時候都會出現realse過后還能調用的現象。而且對象不是…

Maven for Eclipse 第二章 ——安裝 m2eclipse插件

m2eclipse 是一個提供了 Maven 與 Eclipse 整合的插件。它的意圖是橋接上 Maven 和 Eclipse 之間的缺口。通過 Maven 原型提供的簡單直白的接口創建項目&#xff0c;它使 Maven 在 IDE 中非常容易使用。下面是m2eclipse 提供的一些特性。 創建和導入 Maven 項目在 Eclipse 運行…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波9 - 直方圖處理 - 直方圖匹配(規定化)灰度圖像,彩色圖像都適用

直方圖匹配&#xff08;規定化&#xff09; 連續灰度 sT(r)(L?1)∫0rpr(w)dw(3.17)s T(r) (L-1) \int_{0}^{r} p_r(w) \text{d} w \tag{3.17} sT(r)(L?1)∫0r?pr?(w)dw(3.17) 定義關于變量zzz的一個函數GGG&#xff0c;它具有如下性質&#xff1a; G(z)(L?1)∫0zpz(v)d…

C#委托之就是跟委托過不去…

在上一篇博文當中,我們例舉了一個機房自動化系統的邏輯控制程序,其中用到了Lambda表達式,因此方便了我們程序功能的實現.然而,我們不能僅僅為實現功能,完成任務而奮斗,應該知其然,知其所以然,也就是說,知道了Lambda表達式能夠帶來這樣的方便,也應該知道為什么能夠帶來這樣的方便…

closewait一直不釋放_機床為什么要釋放應力?怎么釋放應力才好?

在機床行業內一直有種說法&#xff0c;就是機床需要釋放應力&#xff0c;而且越是高精密的機床就越要注意應力的釋放&#xff0c;最近就有機床粉向小編詢問應力是什么&#xff1f;為什么要釋放應力&#xff1f;如果釋放要釋放多久&#xff1f;怎么釋放應力才好等一系列關于機床…

HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

點我看題目 題意 &#xff1a;兩條平行線上分別有兩種城市的生存&#xff0c;一條線上是貧窮城市&#xff0c;他們每一座城市都剛好只缺乏一種物資&#xff0c;而另一條線上是富有城市&#xff0c;他們每一座城市剛好只富有一種物資&#xff0c;所以要從富有城市出口到貧窮城市…

表單元素選擇器

無論是提交還是傳遞數據&#xff0c;表單元素在動態交互頁面的作用是非常重要的。jQuery中專門加入了表單選擇器&#xff0c;從而能夠極其方便地獲取到某個類型的表單元素 表單選擇器的具體方法描述&#xff1a; 注意事項&#xff1a; 除了input篩選選擇器&#xff0c;幾乎每個…