五、线程管理————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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DES加密解密与AES加密解密
- 下一篇: iOS中Block的基础用法