亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS多線程-02-GCD

2019-11-14 18:27:27
字體:
來源:轉載
供稿:網友

簡介


  • GCD(Grand Center Dispatch)是Apple為多核的并行運算提出的解決方案,純C語言
  • 更加適配多核處理器,且自動管理線程的生命周期,使用起來較為方便
  • GCD通過任務和隊列實現多線程功能

    • 任務:描述所要執行的操作
    • 隊列:用來存放所要執行的任務,隊列中的任務遵循FIFO(First In First Out)原則

GCD的任務函數(是否開啟新的線程)


  • 同步

    • 不具備開啟新的線程的能力
    • 同步執行任務的函數

      • void dispatch_sync(dispatch_queue_t queue, dispatch_block_t block),Block類型

        • queue:任務隊列
        • block(代碼塊):所執行的任務
      • void dispatch_sync_f(dispatch_queue_t queue, void *context, dispatch_function_t work),函數類型(每個Block類型都對應一個函數類型)

        • queue:任務隊列
        • context:傳遞給任務函數的參數
        • work(函數):所執行的任務
    • 同步執行任務的其他函數(barrier),在前面的任務執行完畢它才執行,它后邊的任務等它執行完畢才執行

      • void dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block),block類型

        • queue:任務隊列,僅當該參數為并發隊列時,該函數才有意義
      • dispatch_barrier_sync_f(dispatch_queue_t queue, void *context, dispatch_function_t work),函數類型

  • 異步

    • 具備開啟新的線程的能力(需要將任務添加到并發隊列中)
    • 異步執行任務的函數(參數意義與同步函數相同)

      • void dispatch_async(dispatch_queue_t queue, dispatch_block_t block)
      • void dispatch_async_f(dispatch_queue_t queue, void *context, dispatch_function_t work)
    • 異步執行任務的其他函數(barrier),在前面的任務執行完畢它才執行,它后邊的任務等它執行完畢才執行(參數意義與同步函數相同)

      • void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block)
      • void dispatch_barrier_async_f(dispatch_queue_t queue, void *context, dispatch_function_t work)

GCD的隊列(任務的執行方式)


  • 并發隊列

    • 開啟多個線程,使隊列中的多個任務并發執行(需要異步執行函數的配合)
  • 串行隊列

    • 隊列中的任務一個接一個順序地執行
  • 隊列的種類

    • 串行隊列

      • dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

        • label:通常為0
        • attr:隊列類型,DISPATCH_QUEUE_SERIAL
    • 并發隊列

      • dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

        • label:通常為0
        • attr:隊列類型 DISPATCH_QUEUE_CONCURRENT
    • 主隊列(串行,只能在主線程中運行)

      • dispatch_queue_t dispatch_get_main_queue(void),獲取主隊列
    • 全局隊列(并發)

      • dispatch_queue_t dispatch_get_global_queue(long identifier, unsigned long flags)

任務與隊列的組合


  • 同步函數

    • 同步函數主隊列

      /**- 運行在主線程主隊列(未開啟新的線程),主線程被卡死- 原因:任務代碼等待著當前函數執行完畢才能執行(當前函數正在執行且未執行完畢);	   當前函數等待著任務代碼 執行完畢才能執行(當前任務正在執行且未執行完畢);	   相互等待,出現死鎖*///獲取主隊列dispatch_queue_t queue = dispatch_get_main_queue();//添加任務到隊列dispatch_sync(queue, ^{    //任務1代碼});dispatch_sync(queue, ^{    //任務2代碼});
    • 同步函數串行隊列

      /**- 運行在主線程串行非主隊列(未開啟新的線程),任務串行執行*///創建串行隊列dispatch_queue_t queue = dispatch_queue_create("com.23565@QQ", DISPATCH_QUEUE_SERIAL);//添加任務到隊列dispatch_sync(queue, ^{    //任務1代碼});dispatch_sync(queue, ^{    //任務2代碼});
    • 同步函數并發隊列

      /**- 運行在非主線程并發隊列(未開啟新的線程),任務串行執行*///獲取全局隊列(并發)dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//將任務加至隊列dispatch_sync(queue, ^{    //任務1代碼});dispatch_sync(queue, ^{    //任務2代碼});
  • 異步函數

    • 異步函數主隊列

      /**- 運行在主線程主隊列(未開啟新的線程),任務串行執行*/// 獲得主隊列dispatch_queue_t queue = dispatch_get_main_queue();// 將任務加入隊列dispatch_async(queue, ^{    //任務1代碼});dispatch_async(queue, ^{    //任務2代碼});
    • 異步函數串行隊列

      /**- 運行在主函數串行非主隊列(未開啟新的線程),任務串行執行*///創建串行隊列dispatch_queue_t queue = dispatch_queue_create("com.23565@qq", DISPATCH_QUEUE_SERIAL);//將任務加至隊列dispatch_async(queue, ^{    //任務1代碼})dispatch_async(queue, ^{    //任務2代碼})
    • 異步函數并發隊列

      /**- 運行在非主線程并發隊列(開啟新的線程),任務并發執行- 系統根據任務創建線程(無法確定任務執行在哪個線程)*///獲得全局并發隊列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//將任務加入隊列dispatch_async(queue, ^{    //任務1代碼});dispatch_async(queue, ^{    //任務2代碼});

      線程之間的通信


  • 從主線程到子線程

    • 注意

      • 只有異步函數與并發隊列的組合,才會開啟新的線程,使任務并發執行
      • 通常使用異步函數將任務添加到并發隊列中,來實現從主線程到子線程的通信
    • 實現代碼

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{		//需要在子線程中執行的任務代碼	})
  • 從子線程到主線程

    • 注意

      • 主隊列中的任務只能在主線程中執行
      • 通常使用異步/同步函數將任務添加到主隊列中,來實現從子線程到主線程的通信
    • 實現代碼

      dispatch_async(dispatch_get_main_queue(), ^{        //需要在主線程中執行的代碼    })

GCD的其他任務


  • 單次執行(通常用在單例模式的設計中)

    //定義一個標記static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{    //此處的代碼只會被執行一次});
  • 延遲執行

    /**- 方法一(GCD)*/dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    //此處的代碼將延遲執行});/**- 方法二(performSelector)*/[self performSelector:@selector(run) withObject:self afterDelay:2.0];/**- 方法三(NSTimer)*/[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:NO]
  • 快速迭代

    void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t))/**	iterations:迭代執行的次數	queue:任務隊列	block:迭代執行的代碼	size_t:用來定義當前迭代到第幾次,需要自己添加,如在size_t后添加index索引,記錄當前的迭代次數*/
  • Barrier

    /**- Barrier中的任務,只能在它前面的任務執行完畢才能執行  Barrier后的任務,只能等到它執行完畢才能執行- 要將隊列添加到自己創建的并發隊列中,否其功能等同于函數  void dispatch_async(dispatch_queue_t queue, dispatch_block_t block)*///創建隊列(通常是自己創建的并發隊列)dispatch_queue_t queue = dispatch_queue_create("123", DISPATCH_QUEUE_CONCURRENT);//將任務添加到隊列dispatch_async(queue, ^{    //在Barrier前執行的任務代碼});dispatch_barrier_async(queue, ^{   //Barrier中的任務代碼});dispatch_async(queue, ^{    //在Barrier后執行的任務代碼});
  • 隊列組

    //獲取全局并發隊列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//創建隊列組dispatch_group_t group = dispatch_group_create();//添加任務到隊列組dispatch_group_async(group, queue, ^{    	//任務1代碼	});dispatch_group_async(group, queue, ^{    	//任務2代碼	});dispatch_group_notify(group, queue, ^{    	//任務3代碼    	/**    	group組中的所有任務執行完畢在執行    	若group為空,則立即執行    	*/});

GCD定時器


  • 實現原理

    • 創建一個DISPATCH_SOURCE_TYPE_TIMER類型的dispatch source,并添加到dispatch queue,通過dispatch source來響應事件
    • 通過函數void dispatch_source_set_timer(dispatch_source_t source, dispatch_time_t start, uint64_t interval, uint64_t leeway),來設置dispatch source的執行事件
  • 實現代碼

    //獲得隊列dispatch_queue_t queue = dispatch_get_main_queue();//創建一個定時器self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);//設置定時器的各種屬性(起止時間)dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8.0 * NSEC_PER_SEC));uint64_t interval = (uint64_t)(1.0 * NSEC_PER_SEC);//設置dispatch_source_set_timer(self.timer, start, interval, 0);//設置回調dispatch_source_set_event_handler(self.timer, ^{    //定時器被觸發時所要執行的代碼});//開啟定時器dispatch_resume(self.timer);//取消定時器dispatch_cancel(self.timer);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产精品日韩| 91深夜福利视频| 91chinesevideo永久地址| 午夜欧美不卡精品aaaaa| 国产日韩欧美日韩| 九色精品免费永久在线| 永久555www成人免费| 亚洲第一精品夜夜躁人人躁| 菠萝蜜影院一区二区免费| 91精品国产色综合久久不卡98口| 中文字幕av一区| 国产婷婷色综合av蜜臀av| 欧美韩日一区二区| 欧美多人乱p欧美4p久久| 欧美风情在线观看| 国产在线视频91| 亚洲理论在线a中文字幕| 亚洲精选中文字幕| 亚洲黄页视频免费观看| 亚洲精品日韩激情在线电影| 欧美视频裸体精品| 久久人人爽人人爽人人片亚洲| 日日狠狠久久偷偷四色综合免费| 精品一区精品二区| 91国产中文字幕| 91亚洲国产成人精品性色| xvideos亚洲| 成人久久一区二区三区| 夜夜嗨av一区二区三区四区| 国产福利成人在线| 4p变态网欧美系列| 国产精品最新在线观看| 精品丝袜一区二区三区| 中文字幕精品—区二区| 久久天天躁狠狠躁老女人| 亚洲欧美日韩久久久久久| 精品视频久久久久久| 国产免费一区二区三区香蕉精| 岛国av在线不卡| 成人激情视频免费在线| 久久视频在线看| 亚洲精品福利在线| 日韩av网站在线| 国内精品模特av私拍在线观看| 国产一区二区av| 欧美影院成年免费版| 亚洲国产欧美在线成人app| 欧美插天视频在线播放| 26uuu亚洲国产精品| 欧美日韩成人在线视频| 俺去了亚洲欧美日韩| 久久影视电视剧凤归四时歌| 一本久久综合亚洲鲁鲁| 日韩av中文字幕在线| 日韩欧美亚洲国产一区| 在线不卡国产精品| 亚洲一级一级97网| 欧美裸体视频网站| 亚洲成人免费在线视频| 日韩精品福利在线| 日本一区二区三区在线播放| 国产精品久久999| 国产精品福利观看| 亚洲天堂av综合网| 日韩美女中文字幕| 日韩激情在线视频| 美日韩丰满少妇在线观看| 超薄丝袜一区二区| 668精品在线视频| 欧美在线视频免费观看| 亚洲色图校园春色| 久久久91精品国产| 亚洲激情自拍图| 成人免费视频a| 欧美国产日韩一区二区| 91高清免费视频| 国色天香2019中文字幕在线观看| 日韩精品一区二区三区第95| 亚洲欧美在线磁力| 日韩精品免费综合视频在线播放| 51久久精品夜色国产麻豆| 日韩免费高清在线观看| 91黑丝高跟在线| 亚洲国产中文字幕久久网| 最新69国产成人精品视频免费| 久久久久久久久中文字幕| 亚洲色图25p| 一区二区在线免费视频| 亚洲精品福利视频| 91九色单男在线观看| 国产精品网站入口| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲xxx视频| www.日韩av.com| 国产精品亚洲网站| 欧美日韩国产二区| 亚洲国模精品私拍| 欧美性理论片在线观看片免费| 精品久久久久久久久中文字幕| 91精品啪aⅴ在线观看国产| 欧美乱大交xxxxx另类电影| 日韩av色综合| 精品国产福利视频| 日本欧美在线视频| 亚洲欧洲免费视频| 91在线免费视频| 久久久久久国产精品美女| 久久九九精品99国产精品| 欧美激情亚洲另类| 黄色一区二区三区| 亚洲在线观看视频网站| 欧美成人免费在线视频| 成人亚洲激情网| 欧美尺度大的性做爰视频| 日韩电影中文字幕| 欧美性视频网站| 亚洲毛片在线观看.| 日日狠狠久久偷偷四色综合免费| 欧美日韩国产va另类| 国产区精品在线观看| 亚洲深夜福利网站| 91沈先生作品| 国产精品91久久久| 影音先锋欧美精品| 久久不射电影网| 国产精品r级在线| 国产精品99蜜臀久久不卡二区| 亚洲性线免费观看视频成熟| 日韩激情第一页| 国内免费精品永久在线视频| 97在线看免费观看视频在线观看| 国产精品夜间视频香蕉| 国产精品欧美一区二区| 亚洲一级黄色片| 亚洲精品久久在线| 国产精品99久久久久久白浆小说| 亚洲福利在线播放| 欧美性xxxxx极品娇小| 国产精品久久久久久久久久久久久| 日韩影视在线观看| 日韩成人黄色av| 国产美女精品免费电影| 最新亚洲国产精品| 精品亚洲精品福利线在观看| 亚洲无亚洲人成网站77777| 久久久久成人精品| 亚洲tv在线观看| 欧美性猛交xxxx黑人猛交| 亚洲肉体裸体xxxx137| 国产欧美精品一区二区三区-老狼| 国产精品久久国产精品99gif| 精品国产91久久久| 精品视频在线播放色网色视频| 92国产精品久久久久首页| 992tv在线成人免费观看| 69av视频在线播放| 久久999免费视频| 日韩激情视频在线| 神马久久桃色视频| 一个人www欧美| 国产91精品久久久久| 欧美成人免费全部| 日韩欧美视频一区二区三区| 成人欧美一区二区三区黑人|