精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久综合久久综合这里只有精品| 亚洲成人性视频| 亚洲精品不卡| 国产aⅴ爽av久久久久成人| 在线欧美不卡| 在线午夜精品自拍| 精产国品一区二区三区| 性欧美xxx69hd高清| 国产精品乱人伦一区二区| 51午夜精品| 香蕉影院在线观看| 影视亚洲一区二区三区| 亚洲欧美自拍一区| 亚洲三级在线视频| 日日夜夜天天综合| 亚洲一区中文日韩| 一本一生久久a久久精品综合蜜| 高潮一区二区三区乱码| 蜜桃视频一区二区| 911国产网站尤物在线观看| 希岛爱理中文字幕| 成人婷婷网色偷偷亚洲男人的天堂| 欧美xxx久久| 欧美日韩一区二区三区69堂| 成人片免费看| 亚洲3atv精品一区二区三区| 中文视频一区视频二区视频三区| 牛牛热在线视频| 国产成人免费网站| 成人久久一区二区| 精人妻无码一区二区三区| 亚洲国产一区二区三区a毛片| 久久亚洲欧美日韩精品专区| 夫妇交换中文字幕| 中国av一区| 亚洲精品97久久| 无码人妻丰满熟妇区毛片蜜桃精品| 91国拍精品国产粉嫩亚洲一区| 亚洲.国产.中文慕字在线| 精品一区二区成人免费视频 | 日韩精品一区二区三区四区五区 | 亚洲国产91视频| 色哟哟精品一区| 日韩欧美精品在线观看视频| 老司机深夜福利在线观看| 亚洲成人777| 男女猛烈激情xx00免费视频| 国产羞羞视频在线播放| 亚洲一区二区3| 又大又硬又爽免费视频| 欧美极品少妇videossex| 一区二区三区高清| 精品人妻大屁股白浆无码| 污污的网站在线看| 亚洲一区视频在线| 日本a视频在线观看| 久草免费在线视频| 欧美性感美女h网站在线观看免费| 免费看一级大黄情大片| 综合日韩av| 在线精品亚洲一区二区不卡| 亚洲精品自拍网| 2020国产精品小视频| 欧美一区二区三区日韩视频| 女女调教被c哭捆绑喷水百合| 欧美电影在线观看一区| 日韩精品在线一区| 在线观看国产免费视频| 日韩精品a在线观看91| 亚洲美女黄色片| 国产探花视频在线播放| 91精品成人| 国内精品美女av在线播放| 亚洲自拍一区在线观看| 麻豆国产欧美日韩综合精品二区 | 好吊色一区二区| 99国产精品国产精品久久| 日本免费高清一区| 男人影院在线观看| 亚洲午夜在线电影| 国产在线观看福利| 亚洲高清影院| 亚洲精品www| 一级黄色录像毛片| 雨宫琴音一区二区三区| 国语自产精品视频在线看一大j8| 日本一区二区免费电影| 精品亚洲免费视频| 国内精品一区二区| 亚洲欧美视频一区二区| 亚洲最新视频在线播放| 天天操天天摸天天爽| 欧美一区一区| 亚洲天堂av网| 久久久久久久久久91| 美女国产精品| 99久久99| 国产女人在线观看| 亚洲精品日产精品乱码不卡| 免费日韩视频在线观看| 永久免费精品视频| 中文字幕亚洲自拍| 日本午夜精品理论片a级app发布| 蜜桃av噜噜一区| 狠狠色综合网站久久久久久久| 欧美成人三区| 日韩欧美国产成人| 91亚洲一线产区二线产区| 欧美日韩国产传媒| 97精品视频在线观看| 91精品国产色综合久久不8| 91免费视频大全| 国产尤物av一区二区三区| 69堂免费精品视频在线播放| 亚洲国产精品中文| 久久久久亚洲AV成人| 日韩—二三区免费观看av| 国内精品**久久毛片app| 97超碰在线公开在线看免费| 精品视频色一区| 伊人网伊人影院| 中日韩视频在线观看| 不卡一区二区三区四区五区| 男人资源在线播放| 欧美日韩中文精品| 久久久久亚洲av无码a片| 日韩一级欧洲| 国产欧美亚洲日本| 欧洲性视频在线播放| 欧美一区三区二区| 永久免费未视频| 免费高清视频精品| 日本一区二区在线视频| 欧美电影免费观看| 日韩激情av在线免费观看| 欧美日韩中文视频| 国产成人福利片| 国产精品视频一二三四区| 国产精品毛片无码| 久久久极品av| 国产精品无码免费播放| 日韩毛片精品高清免费| 国产精品区在线| 欧美大片aaaa| 91精品国产自产在线| 免费黄色网址在线观看| 欧美高清www午色夜在线视频| 三级黄色片在线观看| 久久国产麻豆精品| 中文字幕在线亚洲三区| 国产一区二区高清在线| 欧美另类在线观看| 蜜桃91麻豆精品一二三区| 亚洲影视在线观看| 日本天堂在线播放| 国内自拍一区| 精品国产综合区久久久久久| 日韩激情电影免费看| 亚洲欧洲免费视频| 羞羞色院91蜜桃| 自拍偷拍国产亚洲| 特级特黄刘亦菲aaa级| 99riav国产精品| 国内精品视频免费| 欧美大胆成人| 亚洲天堂av综合网| 国产欧美一区二区三区视频在线观看| 亚洲啪啪综合av一区二区三区| 国产成人精品一区二区在线小狼| 伊人久久成人| 欧美视频观看一区| 国产高清精品二区| 午夜精品三级视频福利| 高清中文字幕一区二区三区| 欧美乱妇一区二区三区不卡视频| 国产亚洲精品成人| 国产校园另类小说区| 中文字幕成人在线视频| 欧美欧美天天天天操| 精品午夜一区二区三区| 成人免费一区| 欧美黑人一区二区三区| 免费av在线电影| 日韩网站在线看片你懂的| 日韩精品人妻中文字幕| 亚洲国产精品国自产拍av| 免费看91视频| 老司机精品视频导航| 国产精品久久国产| 日本欧美视频| 国产精品免费区二区三区观看| 成人黄色免费观看| 欧美国产日韩一区二区在线观看| 九色在线视频蝌蚪| 日韩精品一区二区三区在线播放| 日本中文字幕在线| 亚洲欧美日韩一区二区 | 2019亚洲日韩新视频| 98在线视频| 日韩精品在线免费| 精品国自产拍在线观看| 在线视频一区二区三区| 久久久久久激情| 国产精品福利一区| 亚洲国产av一区| 成人综合在线观看| 国产女同无遮挡互慰高潮91| 免费在线播放第一区高清av| 成人av在线播放观看| 91麻豆国产自产在线观看亚洲| 精品久久久久久乱码天堂| 亚洲成人高清| 国产精品美女视频网站| 依依综合在线| 韩国国内大量揄拍精品视频| caopeng在线| 在线观看欧美日韩| 欧美日韩国产综合视频| 精品国产乱码久久久久久免费 | 欧美三区四区| 91chinesevideo永久地址| 男人添女人下部高潮视频在线观看| 日韩在线视频二区| 少妇人妻好深好紧精品无码| www.久久爱.com| 国外成人在线播放| 欧美人与牲禽动交com | 久久综合一区二区三区| 亚洲高清999| 亚洲xxxxx电影| 色999韩欧美国产综合俺来也| 国产成人精品av在线| 成人性生交大片免费观看网站| 欧美激情一区二区三区成人| 在线观看的网站你懂的| 日韩视频一区在线| 日本最黄一级片免费在线| 国产亚洲欧美视频| 国产亚洲依依| 中文字幕无线精品亚洲乱码一区| 男女网站在线观看| 亚洲男人天堂网站| 精品美女视频在线观看免费软件| 亚洲精品视频免费| 麻豆av电影在线观看| 亚洲欧美在线x视频| 色就是色亚洲色图| 亚洲人成电影网站色xx| 成年人在线观看| 在线视频精品一| 暖暖日本在线观看| 欧美精品一本久久男人的天堂| 婷婷色在线播放| 丝瓜av网站精品一区二区| 日韩国产精品一区二区三区| 欧美伦理影院| 永久久久久久| 综合一区在线| 国产欧美日韩小视频| 亚洲作爱视频| 国产成人久久777777| 日韩影院精彩在线| 中文字幕久久av| 国产激情视频一区二区在线观看 | 日本成人7777| 日本一区二区在线| 午夜精品一区二区三区国产 | 美女黄毛**国产精品啪啪| 日韩精品导航| 亚洲国产综合自拍| 欧美jizzhd精品欧美巨大免费| 国产精品一线二线三线| 性感少妇一区| 九九热精品在线播放| 国产黄色91视频| 日韩 中文字幕| 亚洲国产激情av| 黄色在线观看免费| 一本大道av一区二区在线播放| 正在播放亚洲精品| 日韩视频在线一区二区| 视频一区二区三区在线看免费看| 亚洲一级免费视频| 中文字幕资源网在线观看| 777777777亚洲妇女| 欧美激情福利| 久久精品国产综合精品| 久久伦理在线| 国内性生活视频| 激情久久久久久久久久久久久久久久| 深夜视频在线观看| 国产欧美日韩精品一区| 久久久无码一区二区三区| 色爱区综合激月婷婷| 性网爆门事件集合av| 亚洲色图综合久久| 国产偷倩在线播放| 国产啪精品视频| 欧美精品中文| 老汉色影院首页| 日韩精品成人一区二区三区| 五月天丁香社区| 亚洲欧洲av色图| 日韩手机在线视频| 亚洲精品在线网站| 黄视频网站在线| 国产精品video| 麻豆一区二区麻豆免费观看| 老司机av福利| 久久天堂精品| 懂色av粉嫩av蜜乳av| 一区二区三区波多野结衣在线观看| 亚洲精品久久久久久久蜜桃| 亚洲国产欧美精品| 亚洲性图自拍| 国产一区红桃视频| 精品美女视频| 欧美日韩激情视频在线观看| 国产成人av一区二区三区在线观看| 色欲狠狠躁天天躁无码中文字幕| 精品国产乱码久久久久久天美 | 中文字幕欧美日韩| 小视频免费在线观看| 国产成人精品一区二区三区福利 | 日本一区二区三级电影在线观看 | 亚洲国产日韩美| 首页国产欧美日韩丝袜| 三级男人添奶爽爽爽视频| 亚洲曰韩产成在线| 国产99999| 欧美精品做受xxx性少妇| 亚洲欧洲一二区| 中文一区一区三区免费| 一区二区视频播放| 7777精品久久久大香线蕉| 丁香婷婷在线观看| 国产不卡一区二区在线播放| 色愁久久久久久| 黄色一级片播放| 久久综合九色欧美综合狠狠| av黄色在线看| 日韩精品丝袜在线| 亚洲福利影院| 欧美一区二区三区在线免费观看| 久久精品电影| 亚洲区自拍偷拍| 欧美三级日韩三级国产三级| 成人全视频高清免费观看| 国产精品麻豆va在线播放| 第一会所sis001亚洲| 天天操天天爽天天射| 中文字幕乱码日本亚洲一区二区| 最近中文字幕免费在线观看| 色老头一区二区三区| 亚洲成人a级片| 毛片av在线播放| 成人av手机在线观看| 国产午夜在线播放| 精品视频偷偷看在线观看| 免费观看亚洲| 午夜精品一区二区三区四区| 久久精品72免费观看| 日本中文字幕免费在线观看| 日韩欧美成人午夜| av毛片午夜不卡高**水| 精品一区二区视频| 三级欧美韩日大片在线看| 国产精品www爽爽爽| 欧美高清视频不卡网| 伊人春色在线观看| 蜜桃av久久久亚洲精品| 日韩精品电影在线| 69av视频在线| 日韩av在线天堂网| 视频精品导航| 国产91在线亚洲| 久久婷婷色综合| 91在线视频国产| 久久久噜噜噜久久| 国产亚洲电影| 男人的天堂免费| 色综合久久中文综合久久97| 看电影就来5566av视频在线播放| 成人羞羞国产免费| 欧美日韩三级电影在线| 青青草福利视频| 欧美午夜精品免费| 久久久久久久久免费视频| 国产精品扒开腿做爽爽爽视频| 欧美在线看片| 久久成人激情视频| 日韩精品影音先锋| 成人天堂yy6080亚洲高清| 国产又粗又猛又爽又黄的网站| 国产女主播视频一区二区| 男人天堂网在线视频| 国产日本欧美一区| 亚洲免费网址| 久久久久久福利| 日韩中文字幕在线观看|