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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

GCD,大家都知道的回顾

發布時間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GCD,大家都知道的回顾 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GCD,自iOS4.0吧,比block還要早,他的用處主要是體現在線程方面,比如你有個比較麻煩的而且循環比較大的代碼段什么,比如有個后臺下載什么的,這都必須放在子線程里一個放在子線程里執行,為了不影響用戶體驗!

來說說幾個很基本的東西方便了解:

串行

系統默認就有一個串行隊列main_queue,也就是主線程所在的隊列,因為是串行,所以可以認為通過這個回到主線程

自定義dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
??????????????????????????? DISPATCH_QUEUE_CONCURRENT);(queueName 自定義的串行隊列的名稱)

執行一般是dispatch_get_main_queue()

?

?

并行

系統默認就有一個并行隊列global_queue

自定義dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
??????????????????????????? DISPATCH_QUEUE_SERIAL);

關于并行,有個優先級的問題,看看系統給的,2,0 ,-2 和最小。。。

?

#define DISPATCH_QUEUE_PRIORITY_HIGH?2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT?0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

執行一般是dispatch_get_global_queue(這里是填優先級, 這個值可以看說明默認是0);

?

一般經常干的事是什么呢

dispatch_async(這里是并發, ^{

??// long-running task code?here
? ? ? ? dispatch_async(這里是串行,^{

      //update UI code here

          });
??? });

線程的延時操作

dispatch_time(DISPATCH_TIME_NOW(這個是以程序執行的時間點), seconds * NSEC_PER_SEC(這里是設定精確級別的));

dispatch_after(dispatch_time_t when(這個就是上面生成的一個time),dispatch_queue_t queue(隊列),dispatch_block_t block(延遲執行的語句));

線程組

dispatch_group_create()創建一個組

可以用來監控一個group里的內容是否執行完成

dispatch_group_notify(dispatch_group_t group,

            dispatch_queue_t queue,

            dispatch_block_t block);

很奇特的GCD,不是么,group是一個個執行的,但是在這其中,不管你是并行或串行,根本就不會按你所想的規矩來,特別是并發的,當你加入一個group里面他可不會按你代碼排的順序來執行(包括串行),但是最終肯定會執行dispatch_group_notify參數里面的block語句。

GCD定時器

寫成一個內聯函數

NS_INLINE dispatch_source_t GCD_create_timer(int64_t seconds, dispatch_queue_t queue, void (^block)(dispatch_source_t timer))
{
??? //創建Timer
???
??? dispatch_source_t _timer?=dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
?? ?
??? //使用dispatch_source_set_timer函數設置timer參數
??? dispatch_source_set_timer(_timer,
?????????????????????????????       dispatch_time(DISPATCH_TIME_NOW, 0),
?????????????????????????????       seconds * NSEC_PER_SEC,
?????????????????????????????       0);
?? ?  
??? //設置回調
??? dispatch_source_set_event_handler(_timer, ^(){
????????????????????????????????????????? block(_timer);
????????????????????????????????????? });
?? ?
??? //dispatch_source默認是Suspended狀態,通過dispatch_resume函數開始它
??? dispatch_resume(_timer);
??? return _timer;
}

用完記得釋放,否則。。。。(ARC可以不考慮,看看里面的實現吧!)

?

至于同步的。。。你覺得這有討論的必要么,好吧,我確實不知道同步用在那些地方!

?

轉載于:https://www.cnblogs.com/lingzhiguiji/p/3709592.html

總結

以上是生活随笔為你收集整理的GCD,大家都知道的回顾的全部內容,希望文章能夠幫你解決所遇到的問題。

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