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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

GCD,大家都知道的回顾

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

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

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

串行

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

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

執(zhí)行一般是dispatch_get_main_queue()

?

?

并行

系統(tǒng)默認就有一個并行隊列g(shù)lobal_queue

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

關(guān)于并行,有個優(yōu)先級的問題,看看系統(tǒng)給的,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

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

?

一般經(jīng)常干的事是什么呢

dispatch_async(這里是并發(fā), ^{

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

      //update UI code here

          });
??? });

線程的延時操作

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

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

線程組

dispatch_group_create()創(chuàng)建一個組

可以用來監(jiān)控一個group里的內(nèi)容是否執(zhí)行完成

dispatch_group_notify(dispatch_group_t group,

            dispatch_queue_t queue,

            dispatch_block_t block);

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

GCD定時器

寫成一個內(nèi)聯(lián)函數(shù)

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

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

?

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

?

轉(zhuǎn)載于:https://www.cnblogs.com/lingzhiguiji/p/3709592.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。