日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

IOS開發之多線程NSThiread GCD NSOperation Runloop

瀏覽:54日期:2022-09-16 17:05:20
IOS中的進程和線程

通長來說一個app就是一個進程ios開發中較少的運用進程間的通信(XPC),絕大多數使用線程。在ios開發中,為了保證流暢性以及線程安全,所有與UI相關的操作都應該放在主線程,所以有時候主線程也叫UI線程。影響UI體驗,耗時時間較長的操作,盡量放到非主線程中。比如網絡請求以及和本地的IO操作。在IOS開發中有關于多線程的知識點主要包括:NSThread、GCD、NSOperation和Runloop

NSThread

NSthread就是一個線程,它的底層是對pthread的封裝,用于創建一個新的線程,我們也可以通過NSThread中的一些屬性來獲取信息,比如currentThread,isMainThread。

@property (readonly) BOOL isMainThread API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));@property (class, readonly, strong) NSThread *currentThread;

比如我們在子線程中從網絡請求圖片(因為網絡請求比較耗時),并顯示在UI頁面中。

NSThread *downLoadImageThread = [[NSThread alloc] initWithBlock:^{ //將高耗時的獲取圖片的代碼放到子線程中執行 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:item.picUrl]]]; self.rightimageView.image = image; //UI操作必須在主線程中執行,否則會報警}];//設置線程名字downLoadImageThread.name = @'downLoadImageThread';[downLoadImageThread start]; //執行此線程

上面的代碼中,我們把UI顯示的操作放在了子線程中,這是不合規范的,因為在ios中,UI操作的代碼都必須放在主線程中,否則系統會報警。

報警如圖:

IOS開發之多線程NSThiread GCD NSOperation Runloop

GCD

GCD是代碼中dispatch開頭的相關的代碼。GCD解決了NSThread使用的不方便。它將對線程的操作變成了對隊列的操作。它簡化了我們對線程的管理,GCD在底層為我們實現了一個線程池自動的管理線程,我們只要對隊列操作就可以了。和線程一樣,隊列也分主隊列和非主隊列,主隊列里存放的是主線程,非主隊列里存放的是非主線程。如下圖:

IOS開發之多線程NSThiread GCD NSOperation Runloop

GCD中主要有三種隊列:第一:是主線程對應的主隊列。

dispatch_queue_main_t mainQueue = dispatch_get_main_queue(); //獲取主隊列

第二:非主線程按照優先級分為4中不同優先級的非主隊列。High/default/Low/Background其定義的函數如下,其中第一個參數是優先級的選擇,第二個參數暫時用不到可以填0

dispatch_queue_global_t downoadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //獲取非主隊列

第三:自定義隊列創建函數如下:第一個參數是設定隊列的名字,第二個參數 是設定隊列是串行的,還是并發的。至于串行隊列和并發隊列的概念,下面會仔細分析。串行:DISPATCH_QUEUE_SERIAL并行:DISPATCH_QUEUE_CONCURRENT

dispatch_queue_t dispatch_queue_create(const char *_Nullable label,dispatch_queue_attr_t _Nullable attr);

GCD的使用,分為同步執行和異步執行。同步執行,也就是代碼一行一行的執行。其函數調用如下:

dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);

其中第一個參數的隊列名,第二個參數是代碼塊,代碼塊中是我們要在該線程中執行的代碼。異步執行,就是代碼可以跳出當前代碼塊,執行當前代碼之后的代碼,其函數調用如下:

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

其中第一個參數是隊列名,第二個參數是要執行的代碼塊。還有一種執行方式,是延遲執行,其函數調用如下:

void dispatch_after(dispatch_time_t when, dispatch_queue_t queue,dispatch_block_t block);

第一個參數是延遲時間,后面參數同上。概念解讀同步執行:只能在當前線程中執行任務,不具備開啟新線程的能力。異步執行:異步添加任務到指定的隊列中,它不會做任何等待,可以繼續執行任務。可以在新的線程中執行任務,具備開啟(創建)新線程的能力。串行隊列:每次只有一個任務被執行,讓任務一個接著一個地執行。只開啟一個線程,一個任務執行完畢后,再執行下一個任務。并行隊列:可以讓多個任務并打(同時)執行。(可以開啟多個線程,并且同時執行任務)注意:并行隊列的并發功能只有在異步方法下才有效。

這里,我舉一個例子,來解釋一下串行隊列和并發隊列的區別,以及同步執行和異步執行的區別。假設現在有 5 個人要穿過一道門禁,這道門禁總共有 10 個入口,管理員可以決定同一時間打開幾個入口,可以決定同一時間讓一個人單獨通過還是多個人一起通過。不過默認情況下,管理員只開啟一個入口,且一個通道一次只能通過一個人。這個故事里,人好比是 任務,管理員好比是 系統,入口則代表 線程。5個人表示有 5 個任務,10 個入口代表 10 條線程。串行隊列 好比是 5 個人排成一支長隊。并發隊列 好比是 5 個人排成多支隊伍,比如 2 隊,或者 3 隊。同步任務 好比是管理員只開啟了一個入口(當前線程)。異步任務 好比是管理員同時開啟了多個入口(當前線程 + 新開的線程)。『異步執行 + 并發隊列』 可以理解為:現在管理員開啟了多個入口(比如 3 個入口),5 個人排成了多支隊伍(比如 3 支隊伍),這樣這 5 個人就可以 3 個人同時一起穿過門禁了。『同步執行 + 并發隊列』 可以理解為:現在管理員只開啟了 1 個入口,5 個人排成了多支隊伍。雖然這 5 個人排成了多支隊伍,但是只開了 1 個入口啊,這 5 個人雖然都想快點過去,但是 1 個入口一次只能過 1 個人,所以大家就只好一個接一個走過去了,表現的結果就是:順次通過入口。換成 GCD 里的語言就是說:『異步執行 + 并發隊列』就是:系統開啟了多個線程(主線程+其他子線程),任務可以多個同時運行。『同步執行 + 并發隊列』就是:系統只默認開啟了一個主線程,沒有開啟子線程,雖然任務處于并發隊列中,但也只能一個接一個執行了。下面我用GCD來優化一下上面UI操作在子線程中執行的警告問題:

//方法三:使用GCD實現 dispatch_queue_global_t downoadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //獲取非主隊列 dispatch_queue_main_t mainQueue = dispatch_get_main_queue(); //獲取主隊列 //在非主隊列中,異步執行,執行獲取圖片的高耗時操作 //異步:打開了多道門,可以同時穿過門(多線程)具備開啟新線程的能力 dispatch_async(downoadQueue, ^{ //異步 ,非主隊列UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:item.picUrl]]];dispatch_async(mainQueue, ^{ //異步,主線程中執行UI操作 //在主線程中執行UI操作,異步執行 self.rightimageView.image = image; //UI操作必須在主線程中執行,否則會報警}); });NSOperation

由于GCD并沒有針對面向對象的封裝,而我們要執行的代碼都是寫在block中的,如果我們要取消執行一般的block,或者要在多個block之間實現同步和互斥,操作起來都比較復雜。對于更上層的封裝,系統為我們提供了NSOperation,它是系統對GCD的一個面向對象的封裝。關于NSOperation,我后面深入了解后,再進行分享吧。

IOS開發之多線程NSThiread GCD NSOperation Runloop

Runloop

配合著線程是如何進行業務邏輯的操作,以及業務邏輯的執行的,對于每一個線程,系統都提供了一個內部實現,這個內部實現就是Runloop。Runloop就是配合著底層的thread,來處理我們的手勢,交互,以及一些端口的管理等。

IOS開發之多線程NSThiread GCD NSOperation Runloop

舉個例子,主線程為什么會一直存在不被銷毀,底層就是Runloop在維護,它讓主線程在不執行的時候進行睡眠。

最后,我們從宏觀對IOS的多線程有一個認識。

IOS開發之多線程NSThiread GCD NSOperation Runloop

以上就是IOS開發之多線程NSThiread GCD NSOperation Runloop的詳細內容,更多關于IOS開發之多線程的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕成在线观看| 久久精品二区亚洲w码| 欧美在线亚洲| 国产福利亚洲| 日韩午夜高潮| 日韩欧美一区二区三区在线观看| 日韩中出av| 国产剧情在线观看一区| 欧美 日韩 国产一区二区在线视频 | 国产精品探花在线观看| 欧美va天堂在线| 精品中文字幕一区二区三区四区| 欧美三级第一页| 91亚洲精品在看在线观看高清| 免费人成网站在线观看欧美高清| 四虎884aa成人精品最新| 日韩不卡手机在线v区| 亚洲综合电影一区二区三区| 午夜久久99| 欧美日韩国产高清电影| 精品高清久久| 亚洲香蕉久久| 一区二区电影| 在线精品视频一区| 国产欧美高清| 四虎成人av| 欧美天堂视频| 美女日韩在线中文字幕| 午夜视频一区二区在线观看| 国产日产精品_国产精品毛片| 国产精品nxnn| 国产精品啊啊啊| 国产网站在线| 欧美精品一区二区久久| 国产精品丝袜xxxxxxx| 亚洲+小说+欧美+激情+另类| 午夜久久免费观看| 日韩免费一区| 极品日韩av| 日韩三区在线| 美女91精品| 国产精品亚洲人成在99www| 欧洲亚洲一区二区三区| 国产精品欧美大片| 天堂av在线一区| 一区二区不卡| 欧美激情另类| 亚洲精品网址| 精品丝袜久久| 一区二区视频欧美| 国产精品第一国产精品| 国产99亚洲| 欧美国产亚洲精品| 精品国产aⅴ| 欧美日韩三区| 欧美激情麻豆| 亚洲神马久久| 91麻豆国产自产在线观看亚洲| 亚洲免费激情| 欧美日韩视频网站| 欧美综合社区国产| 欧美激情国产在线| 日韩av中文字幕一区| 最新亚洲一区| 亚洲a一区二区三区| 国产一区国产二区国产三区| 亚洲精品婷婷| 亚洲第一精品影视| 国产精品17p| 亚洲精品一级| 在线免费观看亚洲| 欧美.日韩.国产.一区.二区 | 蜜臀久久99精品久久久画质超高清| 噜噜噜久久亚洲精品国产品小说| 亚洲午夜天堂| 国语对白精品一区二区| 欧美激情日韩| 精品三级av| 精品一区视频| 97精品在线| 免费看av不卡| 色综合五月天| 中文字幕av亚洲精品一部二部| 欧美日韩国产一区二区三区不卡 | 99精品综合| 日韩在线综合| 亚洲精品第一| 久久精品高清| 亚洲精品乱码| 一区二区三区午夜视频| 香蕉精品999视频一区二区| 99在线精品免费视频九九视| 欧美特黄a级高清免费大片a级| 亚洲手机在线| 综合干狼人综合首页| 不卡在线一区| 日韩精品视频中文字幕| 麻豆成人av在线| 中文字幕系列一区| 三级在线观看一区二区| 久久精品99国产精品| 国产精品13p| yellow在线观看网址| 亚洲性图久久| 婷婷久久免费视频| 国产精品日韩精品中文字幕| 美女久久久精品| 在线综合视频| 91久久精品无嫩草影院| 成人黄色av| 国产精品亚洲综合在线观看| 青青伊人久久| 欧美aaaaaa午夜精品| 国产在线不卡| 日本视频在线一区| 亚洲啊v在线| 久久国内精品视频| 久久伦理在线| 国产一区二区三区黄网站| 视频一区免费在线观看| 久久久久久久欧美精品| 日韩天堂在线| 欧美/亚洲一区| 国产精品天堂蜜av在线播放| 亚洲深深色噜噜狠狠爱网站| 日韩精品一区二区三区免费观影| 97久久亚洲| 99国产一区| 久久久久中文| 欧美一区三区| 国产理论在线| 国产91在线播放精品| 国产精品va| 国产精品nxnn| 欧美日韩中出| 久久激五月天综合精品| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 91av一区| 青青草91久久久久久久久| 久久精品1区| 国产一区二区三区四区二区 | 亚洲永久av| 精品视频一区二区三区在线观看| 日韩黄色免费网站| 国产日韩欧美一区二区三区| 91九色精品| 久久国产精品亚洲77777| 蜜臀久久99精品久久久久久9| 国产成年精品| 香蕉人人精品| 免费看日韩精品| 国产精品丝袜在线播放| 日本精品一区二区三区在线观看视频| 日韩高清一区二区| 美女av在线免费看| 免费成人在线视频观看| 精品久久91| 久久久久一区| 久久这里只有精品一区二区| 综合日韩在线| 麻豆视频一区| 午夜久久免费观看| 国产精品日本一区二区三区在线 | 水野朝阳av一区二区三区| 蜜臀久久99精品久久久久久9| 国产免费播放一区二区| 视频福利一区| 久久久久国产精品一区二区| 精品日韩毛片| 国产精品乱战久久久| 精品亚洲美女网站| 婷婷精品在线| 日本精品影院| 国产精品宾馆| 爽爽淫人综合网网站| 国产调教一区二区三区| 国产+成+人+亚洲欧洲在线| 蜜臀国产一区二区三区在线播放| 国产一区二区三区不卡视频网站| 久久成人亚洲| 国产精品激情电影| 国产精品久久久久久av公交车| 欧美亚洲激情| 久久精品资源| 奇米色欧美一区二区三区| 日本欧洲一区二区| 91成人精品视频| 日韩国产欧美三级| 丝袜诱惑制服诱惑色一区在线观看| 国产精品99免费看| 国产极品嫩模在线观看91精品| 亚洲制服一区| 91久久视频| 欧美日韩在线网站| 精品国产第一福利网站| 精品一区二区三区在线观看视频 | 免费在线观看精品| 免费毛片在线不卡| 久久香蕉国产| 婷婷激情久久|