日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dispatch_async 与 dispatch_get_global_queue

發布時間:2025/7/14 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dispatch_async 与 dispatch_get_global_queue 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GCD (Grand Central Dispatch) 是Apple公司開發的一種技術,它旨在優化多核環境中的并發操作并取代傳統多線程的編程模式。 在Mac OS X 10.6和IOS 4.0之后開始支持GCD。

使用GCD的一個理由就是方便。回想一下以前的多線程編程,我們會把異步調用的代碼放到另外的一個函數中,并通過NSThread開啟新線程來啟動這段代碼。 這種跳來跳去的流程對于復雜的邏輯簡直就是一場災難。更糟糕的是,調用線程時的環境對異步代碼是不可見的,如果我們需要當時的臨時變量的話只有兩個選擇: 保存到類成員變量中或者作為參數傳遞過去。前者會造成很多莫名奇妙的無關類成員,而后者的功能過于有限。

GCD相對來說是一種更優雅的方式,看如下代碼:

NSString* parameter = [self getSomeParameter]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSString* result = [self fetchResultFromWebWithParameter:parameter];dispatch_async(dispatch_get_main_queue(), ^{[self updateUIWithResult:result];}); });

在上面的代碼中,出現了一種奇怪的格式:

^{code...}

解釋一下,當一段代碼被花括號包裹并在開頭放置上尖號時,我們稱之為塊(block)。如果你學過C語言的話(實際上,block正是apple對C的一個擴展), 你可以認為這是一個增強型的函數指針。它不僅可以當做一個變量來回傳遞,還可以引用本身環境之外的變量(如上面代碼中的parameter)。 更進一步地說,它是apple的C擴展中閉包的實現。在block里引用的對象會自動被retain,因此你也不必擔心內存的問題。

另外涉及到了三個函數

void dispatch_async(dispatch_queue_t queue,dispatch_block_t block);dispatch_queue_t dispatch_get_global_queue(long priority,unsigned long flags); dispatch_get_main_queue();

dispatch_async?函數會將傳入的block塊放入指定的queue里運行。這個函數是異步的,這就意味著它會立即返回而不管block是否運行結束。因此,我們可以在block里運行各種耗時的操作(如網絡請求) 而同時不會阻塞UI線程。?
dispatch_get_global_queue?會獲取一個全局隊列,我們姑且理解為系統為我們開啟的一些全局線程。我們用priority指定隊列的優先級,而flag作為保留字段備用(一般為0)。?
dispatch_get_main_queue?會返回主隊列,也就是UI隊列。它一般用于在其它隊列中異步完成了一些工作后,需要在UI隊列中更新界面(比如上面代碼中的[self updateUIWithResult:result])的情況。

好的,知道這些特性之后,我們可以這樣理解上面的代碼:利用parameter變量異步地發起一個網絡請求,并在請求之后更新UI線程。

轉載于:https://www.cnblogs.com/cynthia116/p/5038425.html

總結

以上是生活随笔為你收集整理的dispatch_async 与 dispatch_get_global_queue的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。