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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

五、线程管理————GCD

發布時間:2024/4/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五、线程管理————GCD 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


本文只對GCD的其他操作進行一些補充。

1、延遲操作

?? ?實例:

//延時操作
? ? dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

? ? });
?
?? ??? ?/*
?? ??? ?dispatch_after的參數
參數1? dispatch_time_t when
多少納秒之后執行
參數2? dispatch_queue_t queue
任務添加到那個隊列
參數3? dispatch_block_t block
要執行的任務
?? ?*/



2、一次性執行

(1)定義:程序運行中只執行一次。一次性執行是線程安全的,可以使用一次性執行創建單例對象,效率比互斥鎖高。

(2)實現:可以用來創建單例對象。

?? ?//原理:當onceToken為0時執行方法,然后將全局變量oneceToken更改為-1,以后就無法再執行。
?? ?static dispatch_once_t onceToken;
??? dispatch_once(&onceToken, ^{
?????? ?
?? ?//要執行一次的代碼;


??? });


3、調度組

(1)定義:有時候需要在多個異步任務都執行完成之后繼續做某些事情,比如下載歌曲,等所有的歌曲都下載完畢之后轉到主線程提示用戶,這樣需要一個順序的統一調度。

(2)實現:

//1 全局隊列
? ? dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
? ? //2 調度組
? ? dispatch_group_t group = dispatch_group_create();
? ? //3 添加任務
? ? //把任務添加到隊列,等任務執行完成之后通知調度組,任務是異步執行
? ? dispatch_group_async(group, queue, ^{
? ? ? ? NSLog(@"歌曲1下載完畢? %@",[NSThread currentThread]);
? ? });
? ? dispatch_group_async(group, queue, ^{
? ? ? ? NSLog(@"歌曲2下載完畢? %@",[NSThread currentThread]);
? ? });
? ? dispatch_group_async(group, queue, ^{
? ? ? ? NSLog(@"歌曲3下載完畢? %@",[NSThread currentThread]);
? ? });
? ? //4 所有任務都執行完成后,獲得通知 (異步執行)
? ? //等調度組中隊列的任務完成后,把block添加到指定的隊列
? ? dispatch_group_notify(group, queue, ^{
? ? ? ? NSLog(@“所有歌曲都已經下載完畢! ? %@",[NSThread currentThread]);
? ? });
?
? ? dispatch_group_notify(group, dispatch_get_main_queue(), ^{
?? ??? ?//在主線程,更新UI控件,提示用戶
? ? ? ? NSLog(@“播放器更新完畢!? %@",[NSThread currentThread]);
? ? });
? ? NSLog(@"over");



(3)原理:
?//1 全局隊列
? ? dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
?
? ? //2 調度組
? ? dispatch_group_t group = dispatch_group_create();
?
? ? //ARC中不用寫
//? ? dispatch_retain(group);
? ? //3 進入調度組,執行此函數后,再添加的異步執行的block都會被group監聽
? ? dispatch_group_enter(group);
?? ?
? ? //4 添加任務一
? ? dispatch_async(queue, ^{
? ? ? ? NSLog(@“下載第一首歌曲!”);
? ? ? ? dispatch_group_leave(group);
? ? ? ? //ARC中此行不用寫,也不能寫
//? ? ? ? dispatch_release(group);
? ? });


? ? //5 添加任務二
? ? dispatch_group_enter(group);
? ? dispatch_async(queue, ^{
? ? ? ? NSLog(@“下載第二首歌曲”);
? ? ? ? dispatch_group_leave(group);
? ? ? ? //ARC中此行不用寫,也不能寫
? ? ? ? //dispatch_release(group);
? ? });
?? ?
? ? //6? 獲得調度組的通知
? ? dispatch_group_notify(group, dispatch_get_main_queue(), ^{
? ? ? ? NSLog(@“歌曲都已經下載完畢! %@",[NSThread currentThread]);
? ? });
//7 等待調度組 監聽的隊列中的所有任務全部執行完畢,才會執行后續代碼,會阻塞線程(很少使用)
? ? dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

轉載于:https://www.cnblogs.com/David-SU/p/5274386.html

總結

以上是生活随笔為你收集整理的五、线程管理————GCD的全部內容,希望文章能夠幫你解決所遇到的問題。

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