精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

GCD介紹(三):Dispatch Sources

移動開發 iOS
本文為大家講述怎樣使用GCD的dispatch source功能來監視文件描述符、計時器、聯結的用戶事件以及其他類似的行為。由于dispatch source完全與dispatch queue相集成,所以你可以使用任意的dispatch queue。你可以將一個dispatch source的句柄在主線程中執行、在全局隊列中并發執行、或者在用戶隊列中串行執行(執行時會將程序的其他模塊的運算考慮在內)。

[[77411]]

何為Dispatch Sources

簡單來說,dispatch source是一個監視某些類型事件的對象。當這些事件發生時,它自動將一個block放入一個dispatch queue的執行例程中。

說的貌似有點不清不楚。我們到底討論哪些事件類型?

下面是GCD 10.6.0版本支持的事件:

  1. Mach port send right state changes.
  2. Mach port receive right state changes.
  3. External process state change.
  4. File descriptor ready for read.
  5. File descriptor ready for write.
  6. Filesystem node event.
  7. POSIX signal.
  8. Custom timer.
  9. Custom event.

這是一堆很有用的東西,它支持所有kqueue所支持的事件(kqueue是什么?見http://en.wikipedia.org/wiki/Kqueue)以及mach(mach是什么?見http://en.wikipedia.org/wiki/Mach_(kernel))端口、內建計時器支持(這樣我們就不用使用超時參數來創建自己的計時器)和用戶事件。

用戶事件

這些事件里面多數都可以從名字中看出含義,但是你可能想知道啥叫用戶事件。簡單地說,這種事件是由你調用dispatch_source_merge_data函數來向自己發出的信號。

這個名字對于一個發出事件信號的函數來說,太怪異了。這個名字的來由是GCD會在事件句柄被執行之前自動將多個事件進行聯結。你可以將數據“拼接”至dispatch source中任意次,并且如果dispatch queue在這期間繁忙的話,GCD只會調用該句柄一次(不要覺得這樣會有問題,看完下面的內容你就明白了)。

用戶事件有兩種: DISPATCH_SOURCE_TYPE_DATA_ADD 和 DISPATCH_SOURCE_TYPE_DATA_OR.用戶事件源有個 unsigned long data屬性,我們將一個 unsigned long傳入 dispatch_source_merge_data。當使用 _ADD版本時,事件在聯結時會把這些數字相加。當使用 _OR版本時,事件在聯結時會把這些數字邏輯與運算。當事件句柄執行時,我們可以使用dispatch_source_get_data函數訪問當前值,然后這個值會被重置為0。

讓我假設一種情況。假設一些異步執行的代碼會更新一個進度條。因為主線程只不過是GCD的另一個dispatch queue而已,所以我們可以將GUI更新工作push到主線程中。然而,這些事件可能會有一大堆,我們不想對GUI進行頻繁而累贅的更新,理想的情況是當主線程繁忙時將所有的改變聯結起來。

用dispatch source就完美了,使用DISPATCH_SOURCE_TYPE_DATA_ADD,我們可以將工作拼接起來,然后主線程可以知道從上一次處理完事件到現在一共發生了多少改變,然后將這一整段改變一次更新至進度條。

啥也不說了,上代碼:

  1. dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_main_queue()); 
  2. dispatch_source_set_event_handler(source, ^{ 
  3.     [progressIndicator incrementBy:dispatch_source_get_data(source)]; 
  4. }); 
  5. dispatch_resume(source); 
  6.  
  7. dispatch_apply([array count], globalQueue, ^(size_t index) { 
  8.     // do some work on data at index 
  9.     dispatch_source_merge_data(source, 1); 
  10. }); 

(對于這段代碼,我很想說點什么,我第一次用dispatch source時,我糾結了很久很久,真讓人蛋疼:Dispatch source啟動時默認狀態是掛起的,我們創建完畢之后得主動恢復,否則事件不會被傳遞,也不會被執行

假設你已經將進度條的min/max值設置好了,那么這段代碼就完美了。數據會被并發處理。當每一段數據完成后,會通知dispatch source并將dispatch source data加1,這樣我們就認為一個單元的工作完成了。事件句柄根據已完成的工作單元來更新進度條。若主線程比較空閑并且這些工作單元進行的比較慢,那么事件句柄會在每個工作單元完成的時候被調用,實時更新。如果主線程忙于其他工作,或者工作單元完成速度很快,那么完成事件會被聯結起來,導致進度條只在主線程變得可用時才被更新,并且一次將積累的改變更新至GUI。

現在你可能會想,聽起來倒是不錯,但是要是我不想讓事件被聯結呢?有時候你可能想讓每一次信號都會引起響應,什么后臺的智能玩意兒統統不要。啊。。其實很簡單的,別把自己繞進去了。如果你想讓每一個信號都得到響應,那使用dispatch_async函數不就行了。實際上,使用的dispatch source而不使用dispatch_async的唯一原因就是利用聯結的優勢。

內建事件

上面就是怎樣使用用戶事件,那么內建事件呢?看看下面這個例子,用GCD讀取標準輸入:

  1.     dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
  2.     dispatch_source_t stdinSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, 
  3.                                                            STDIN_FILENO, 
  4.                                                            0, 
  5. globalQueue); 
  6.     dispatch_source_set_event_handler(stdinSource, ^{ 
  7.         char buf[1024]; 
  8.         int len = read(STDIN_FILENO, buf, sizeof(buf)); 
  9.         if(len > 0) 
  10.             NSLog(@"Got data from stdin: %.*s", len, buf); 
  11.     }); 
  12.     dispatch_resume(stdinSource); 

簡單的要死!因為我們使用的是全局隊列,句柄自動在后臺執行,與程序的其他部分并行,這意味著對這種情況的提速:事件進入程序時,程序正在處理其他事務。

這是標準的UNIX方式來處理事務的好處,不用去寫loop。如果使用經典的 read調用,我們還得萬分留神,因為返回的數據可能比請求的少,還得忍受無厘頭的“errors”,比如 EINTR (系統調用中斷)。使用GCD,我們啥都不用管,就從這些蛋疼的情況里解脫了。如果我們在文件描述符中留下了未讀取的數據,GCD會再次調用我們的句柄。

對于標準輸入,這沒什么問題,但是對于其他文件描述符,我們必須考慮在完成讀寫之后怎樣清除描述符。對于dispatch source還處于活躍狀態時,我們決不能關閉描述符。如果另一個文件描述符被創建了(可能是另一個線程創建的)并且新的描述符剛好被分配了相同的數字,那么你的dispatch source可能會在不應該的時候突然進入讀寫狀態。de這個bug可不是什么好玩的事兒。

適當的清除方式是使用 dispatch_source_set_cancel_handler,并傳入一個block來關閉文件描述符。然后我們使用 dispatch_source_cancel來取消dispatch source,使得句柄被調用,然后文件描述符被關閉。

使用其他dispatch source類型也差不多。總的來說,你提供一個source(mach port、文件描述符、進程ID等等)的區分符來作為diapatch source的句柄。mask參數通常不會被使用,但是對于 DISPATCH_SOURCE_TYPE_PROC 來說mask指的是我們想要接受哪一種進程事件。然后我們提供一個句柄,然后恢復這個source(前面我加粗字體所說的,得先恢復),搞定。dispatch source也提供一個特定于source的data,我們使用 dispatch_source_get_data函數來訪問它。例如,文件描述符會給出大致可用的字節數。進程source會給出上次調用之后發生的事件的mask。具體每種source給出的data的含義,看man page吧。

計時器

計時器事件稍有不同。它們不使用handle/mask參數,計時器事件使用另外一個函數 dispatch_source_set_timer 來配置計時器。這個函數使用三個參數來控制計時器觸發:

start參數控制計時器第一次觸發的時刻。參數類型是 dispatch_time_t,這是一個opaque類型,我們不能直接操作它。我們得需要 dispatch_time 和  dispatch_walltime 函數來創建它們。另外,常量  DISPATCH_TIME_NOW 和 DISPATCH_TIME_FOREVER 通常很有用。

interval參數沒什么好解釋的。

leeway參數比較有意思。這個參數告訴系統我們需要計時器觸發的精準程度。所有的計時器都不會保證100%精準,這個參數用來告訴系統你希望系統保證精準的努力程度。如果你希望一個計時器沒五秒觸發一次,并且越準越好,那么你傳遞0為參數。另外,如果是一個周期性任務,比如檢查email,那么你會希望每十分鐘檢查一次,但是不用那么精準。所以你可以傳入60,告訴系統60秒的誤差是可接受的。

這樣有什么意義呢?簡單來說,就是降低資源消耗。如果系統可以讓cpu休息足夠長的時間,并在每次醒來的時候執行一個任務集合,而不是不斷的醒來睡去以執行任務,那么系統會更高效。如果傳入一個比較大的leeway給你的計時器,意味著你允許系統拖延你的計時器來將計時器任務與其他任務聯合起來一起執行。

總結

現在你知道怎樣使用GCD的dispatch source功能來監視文件描述符、計時器、聯結的用戶事件以及其他類似的行為。由于dispatch source完全與dispatch queue相集成,所以你可以使用任意的dispatch queue。你可以將一個dispatch source的句柄在主線程中執行、在全局隊列中并發執行、或者在用戶隊列中串行執行(執行時會將程序的其他模塊的運算考慮在內)。

下一篇我會討論如何對dispatch queue進行掛起、恢復、重定目標操作;如何使用dispatch semaphore;如何使用GCD的一次性初始化功能。

責任編輯:閆佳明 來源: dreamingwish
相關推薦

2013-07-15 15:51:32

iOS多線程GCD基本概念Dispatch Qu

2013-07-15 16:28:15

iOS多線程GCD介紹Dispatch Qu

2013-07-15 16:00:59

2015-06-26 09:29:12

Grand Centr

2013-07-15 15:23:03

iOS多線程GCD

2023-02-03 14:41:03

地址翻譯模式loongarch

2013-07-15 16:55:54

iOS多線程GCD實戰資源競爭

2012-09-20 10:50:34

IBMdw

2011-08-15 11:13:06

IOS開發并發Dispatch Qu

2010-03-17 17:16:46

Fedora 常用軟件

2011-04-26 11:03:36

三星打印機

2020-12-18 10:04:52

API漏洞應用程序編程接口

2010-04-20 12:00:01

負載均衡技術

2010-04-19 09:31:44

KDE

2010-03-05 11:18:52

Linux shell

2011-07-19 10:26:49

Active Dire回收站

2010-04-26 17:15:13

Oracle優化器

2012-03-15 16:20:35

TizenIntel三星

2009-11-10 12:48:17

VB.NET三維模型

2011-07-21 17:45:02

java
點贊
收藏

51CTO技術棧公眾號

蜜桃av色综合| 中文字幕国产亚洲| 蜜桃传媒一区二区三区| 男男激情在线| 国产精品一区二区三区99| 欧美猛男性生活免费| 538国产视频| 欧美特黄色片| 精品国产91久久久久久老师| 亚洲国产婷婷香蕉久久久久久99| 精品国产一级片| 久热re这里精品视频在线6| 久久精品福利视频| 国产白嫩美女无套久久| 北岛玲精品视频在线观看| 午夜免费久久看| 国产精品av免费| 激情综合闲人网| 成人小视频免费观看| 国产精品欧美激情在线播放| 精品午夜福利视频| 香蕉久久网站| 中国china体内裑精亚洲片| 日本久久久久久久久久| 欧美黄色成人| 色狠狠综合天天综合综合| 超碰10000| 欧美精品电影| 亚洲国产精品成人综合色在线婷婷| 国产私拍一区| 亚洲男女视频在线观看| 韩国成人精品a∨在线观看| 日本精品一区二区三区在线播放视频 | 亚洲成av在线| 欧美午夜无遮挡| 妞干网在线播放| 黄色小网站在线观看| 中文字幕精品—区二区四季| 久久九九视频| 无码国产精品96久久久久| 国产成人综合在线| 91手机在线视频| hs视频在线观看| 久久99久久99小草精品免视看| 日韩免费在线看| 日本熟女毛茸茸| 午夜在线视频一区二区区别| 午夜精品一区二区三区视频免费看| 欧美成欧美va| 国产精品www.| 久久久女人电视剧免费播放下载| 欧美日韩精品在线观看视频| 欧美黄免费看| 欧美韩国理论所午夜片917电影| 黑人巨大精品一区二区在线| 中文字幕一区二区av| 美女av一区二区三区| √天堂中文官网8在线| 国产精品99视频| 欧美精品手机在线| 免费观看一级视频| 亚洲国产91| 668精品在线视频| 成人精品在线看| 视频一区欧美精品| 国产成人精品久久久| 中文字幕人妻丝袜乱一区三区| 日本不卡高清视频| 成人黄色大片在线免费观看| 国产精品综合在线| 国产成人在线电影| 精品国产乱码久久久久久久软件| 四虎精品成人影院观看地址| 国产亚洲欧美色| 亚洲人成网站在线观看播放| av在线导航| 午夜激情一区二区三区| 国产亚洲天堂网| 成人在线免费av| 4hu四虎永久在线影院成人| 精品人妻一区二区三区免费| 九九热播视频在线精品6| 亚洲精品在线视频| av黄色免费在线观看| 欧美激情亚洲| 日本免费久久高清视频| 91成人国产综合久久精品| 国产高清无密码一区二区三区| 国产福利一区二区三区在线观看| 视频一区二区在线播放| 国产精品人人做人人爽人人添| 欧美 国产 精品| 毛片在线网站| 在线不卡中文字幕播放| 污污内射在线观看一区二区少妇| 中文字幕精品影院| 久久人人爽亚洲精品天堂| 日本中文字幕免费| 久久精品国产亚洲aⅴ| 国产精品久久精品视| yjizz视频网站在线播放| 亚洲最大成人网4388xx| 九九热在线免费| 懂色av一区二区| 日韩在线观看网站| 亚洲免费在线观看av| 国产尤物一区二区在线| 欧美日韩亚洲一区二区三区在线观看| 国产激情视频在线观看| 色婷婷综合视频在线观看| 无码人妻丰满熟妇区毛片蜜桃精品| 欧美人妖在线| 久久免费视频网| 97超碰人人模人人人爽人人爱| 99riav久久精品riav| 韩国黄色一级大片| 成人免费一区| 亚洲精品美女网站| 欧美激情国产精品免费| 麻豆一区二区在线| 欧美日韩另类丝袜其他| 爱啪啪综合导航| 欧美一级片免费看| 免费成人美女女在线观看| 欧美一区=区| 国产日韩欧美一区二区三区四区| 国产区在线观看| 欧美性大战久久久久久久| 添女人荫蒂视频| 国产在线不卡| av色综合网| 日本精品在线| 欧美日韩一区中文字幕| 国产av自拍一区| 国产精品日韩精品欧美精品| 肥熟一91porny丨九色丨| 日本电影全部在线观看网站视频| 在线亚洲一区二区| 人妻av无码一区二区三区| 亚洲深夜激情| 精品国产一区二区三区麻豆小说 | 免费欧美一级片| 欧美丰满日韩| 国产日韩在线视频| www.在线视频.com| 欧美亚洲综合一区| 国产黄色录像视频| 日韩1区2区3区| 亚洲精品tv久久久久久久久| 成人四虎影院| 最近2019中文字幕在线高清| 欧美三级网站在线观看| 欧美激情一区二区三区蜜桃视频 | 影音先锋欧美在线| 欧美伊人亚洲伊人色综合动图| 日韩在线欧美在线国产在线| 中文字幕在线观看视频一区| 国产精品美女一区二区在线观看| 亚洲综合欧美激情| 亚洲天堂免费| 成人国产1314www色视频| 91黄页在线观看| 亚洲精品福利在线| 日日摸天天添天天添破| 国产欧美久久久精品影院| 亚洲成色www.777999| 欧美激情欧美| 97超碰人人看人人| av中文字幕在线看| 亚洲精选一区二区| 中文在线观看免费高清| 亚洲视频一区在线| 国产xxx在线观看| 宅男噜噜噜66一区二区| 热re99久久精品国产99热| 亚洲精品一区av| 欧美成人在线免费| 欧美女优在线| 51精品久久久久久久蜜臀| 久久免费在线观看视频| 91丨九色丨蝌蚪富婆spa| 九热视频在线观看| 欧美精品三级| 欧美不卡三区| 激情不卡一区二区三区视频在线 | 欧美极品免费| 欧美成人免费播放| 外国精品视频在线观看 | 999香蕉视频| 天天综合一区| 蜜桃成人免费视频| 欧美经典影片视频网站| 777777777亚洲妇女| 色开心亚洲综合| 亚洲精品成人av| 国产又黄又爽视频| 好吊成人免视频| 国产稀缺精品盗摄盗拍| 91丨porny丨蝌蚪视频| 中文字幕免费高清在线| 中日韩男男gay无套| 中文字幕欧美日韩一区二区| 久久男人av| 91欧美精品午夜性色福利在线 | 91精品在线影院| 在线高清av| 欧美情侣性视频| av大片在线播放| 国产丝袜视频一区| 精品人妻久久久久一区二区三区 | 亚洲欧美日韩一级| 亚洲黄色高清| 丰满人妻一区二区三区53号 | 亚洲欧美另类自拍| www.四虎在线观看| 欧美日韩和欧美的一区二区| 好吊妞视频一区二区三区| 亚洲免费观看高清完整版在线| 国产成人一区二区在线观看| av一区二区不卡| 91人妻一区二区三区| 美女视频黄久久| 哪个网站能看毛片| 亚洲伦理一区| 好色先生视频污| 久久在线视频免费观看| 人禽交欧美网站免费| 日韩深夜福利| 久久艹中文字幕| 97久久综合精品久久久综合| 91精品视频一区| 国产人妖一区| 国产精品美乳一区二区免费 | 成人国产精品久久久| 91国拍精品国产粉嫩亚洲一区| 69久久夜色精品国产69| rebdb初裸写真在线观看| 欧美大片网站在线观看| free性欧美hd另类精品| 蜜臀久久99精品久久久无需会员| 美女羞羞视频在线观看| 日韩在线观看免费全| 欧美激情二区| 日韩在线视频免费观看高清中文 | 欧美激情精品久久久久久大尺度| 精产国品自在线www| 久久久成人的性感天堂| 国产福利在线播放麻豆| 欧美成人一区在线| 女同一区二区免费aⅴ| 欧美寡妇偷汉性猛交| 久久99亚洲网美利坚合众国| 欧美风情在线观看| h片在线观看| 55夜色66夜色国产精品视频| 竹内纱里奈兽皇系列在线观看| 日本aⅴ大伊香蕉精品视频| 成人一区福利| 国产精品日日做人人爱| 欧美成人福利| 成人久久18免费网站漫画| www.成人网| 久久狠狠久久综合桃花| 欧美美女在线观看| 一本久道久久综合| 在线看片不卡| 日韩中字在线观看| 媚黑女一区二区| 天天干天天玩天天操| 国产麻豆成人精品| 中文在线观看免费视频| 91久色porny| 99自拍偷拍视频| 亚洲国产精品影院| 亚洲图片欧美日韩| 欧美福利视频导航| 日本高清视频免费看| 亚洲片国产一区一级在线观看| аⅴ资源新版在线天堂| 欧美福利视频网站| 亚洲国产成人二区| 成人乱色短篇合集| 欧美一级一片| 一区二区三区四区五区精品 | 中文字幕在线不卡一区| 青青草在线观看视频| 色综合天天天天做夜夜夜夜做| 一本一道人人妻人人妻αv| 日韩女优制服丝袜电影| 国产三级在线看| 欧美极品在线播放| av在线日韩| 国产伦精品一区二区三区免 | 欧美精品久久久久久久免费| 日韩高清电影一区| www.四虎在线| 国产精品久久久久久福利一牛影视 | 视色视频在线观看| www.日韩大片| 91高清免费观看| 色丁香久综合在线久综合在线观看| 国产免费久久久| 国产亚洲精品久久久久久| 日本在线观看高清完整版| 国产精品久久久久av| 国产91精品入| 中文字幕一区二区三区四区五区人 | 国产精品久久久99| 日韩精品人妻中文字幕| 3d动漫精品啪啪一区二区竹菊| 少妇性bbb搡bbb爽爽爽欧美| 欧美日韩国产91| 成人精品国产| 欧美一区国产一区| 一区在线视频| 日本中文字幕在线不卡| 国产精品情趣视频| 国产精品21p| 亚洲精品国产精品国自产在线 | 精品视频一二三| 久久久久久久久国产| 国产精品一区二区精品视频观看| 日本不卡在线观看| 国产美女一区| 超碰caoprom| 亚洲一区在线播放| 精品毛片在线观看| 久久九九免费视频| 日韩久久一区| 天堂资源在线亚洲视频| 久久午夜精品| 97超碰在线免费观看| 精品magnet| 色综合久久久久久| 久久久免费精品视频| xxxx日韩| 国产一线二线三线女| 国产成人99久久亚洲综合精品| 国产传媒免费在线观看| 91超碰这里只有精品国产| 久草免费在线观看| 亚洲www永久成人夜色| 99久久99久久精品国产片桃花| 美女喷白浆视频| 欧美高清在线精品一区| 日本成人一级片| 中文字幕亚洲精品| 久久久加勒比| 三年中文高清在线观看第6集| 精品制服美女久久| 我要看黄色一级片| 日韩午夜av一区| 国内在线免费视频| 国产精品视频500部| 国产欧美91| 国产美女精品久久| 91福利在线导航| 91在线网址| 亚洲一区二区三区香蕉| 国产精品扒开腿做爽爽爽软件| 欧洲熟妇的性久久久久久| 偷拍日韩校园综合在线| 视频福利在线| 国产精品美乳在线观看| 亚洲成人二区| 91人妻一区二区| 亚洲国产精品影院| 你懂的视频在线免费| 国产精品一区二区三区久久久| 五月天综合网站| 精品人妻伦一二三区久| 日韩欧美中文字幕在线观看 | 久久久久免费精品国产| 欧美三级电影在线| 妺妺窝人体色www在线观看| 中文字幕五月欧美| 亚洲精品视频专区| 欧美性受xxx| 婷婷综合视频| 国产麻豆剧传媒精品国产av| 一本色道久久综合精品竹菊| 免费的黄网站在线观看| 国产精品 日韩| 日本免费新一区视频| 中文字幕在线观看成人| 亚洲国产精品久久久| 电影一区二区| 9色porny| 亚洲国产精品成人综合色在线婷婷| 国产精品一区二区免费视频| 午夜精品一区二区三区在线视| 精品一区二区三区中文字幕老牛| 中文字幕乱妇无码av在线| 日韩欧美高清在线视频| 国产精品扒开做爽爽爽的视频| 久久国产日韩欧美| 国产一区二区精品在线观看| 免费污污视频在线观看| 九九精品视频在线观看| 国产在线日韩精品|