iOS多執行緒的初步研究(九)-- dispatch源
dispatch源(dispatch source)和RunLoop源概念上有些類似的地方,而且使用起來更簡單。要很好地理解dispatch源,其實把它看成一種特別的生產消費模式。dispatch源好比生產的資料,當有新資料時,會自動在dispatch指定的佇列(即消費佇列)上執行相應地block,生產和消費同步是dispatch源會自動管理的。
dispatch源的使用基本為以下步驟:
1. dispatch_source_t source = dispatch_source_create(dispatch_source_type, handler, mask, dispatch_queue); //建立dispatch源,這裡使用加法來合併dispatch源資料,最後一個引數是指定dispatch佇列
2. dispatch_source_set_event_handler(source, ^{ //設定響應dispatch源事件的block,在dispatch源指定的佇列上執行
//可以通過dispatch_source_get_data(source)來得到dispatch源資料
});
3. dispatch_resume(source); //dispatch源建立後處於suspend狀態,所以需要啟動dispatch源
4. dispatch_source_merge_data(source, value); //合併dispatch源資料,在dispatch源的block中,dispatch_source_get_data(source)就會得到value。
是不是很簡單?而且完全不必編寫同步的程式碼。比如網路請求資料的模式,就可以這樣來寫:
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_event_handler(source, ^{
dispatch_sync(dispatch_get_main_queue(), ^{
//更新UI
});
});
dispatch_resume(source);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//網路請求
dispatch_source_merge_data(source, 1); //通知佇列
});
dispatch源還支援其它一些系統源,包括定時器、監控檔案的讀寫、監控檔案系統、監控訊號或程式等,基本上呼叫的方式原理和上面相同,只是有可能是系統自動觸發事件。比如dispatch定時器:
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 10*NSEC_PER_SEC, 1*NSEC_PER_SEC); //每10秒觸發timer,誤差1秒
dispatch_source_set_event_handler(timer, ^{
//定時處理
});
dispatch_resume(timer);
其它情況的dispatch源就不再一一舉例,可參看官網有具體文件: https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html#//apple_ref/doc/uid/TP40008091-CH103-SW1
最後,dispatch源的其它一些函式大致羅列如下:
uintptr_t dispatch_source_get_handle(dispatch_source_t source); //得到dispatch源建立,即呼叫dispatch_source_create的第二個引數
unsignedlong dispatch_source_get_mask(dispatch_source_t source); //得到dispatch源建立,即呼叫dispatch_source_create的第三個引數
void dispatch_source_cancel(dispatch_source_t source); //取消dispatch源的事件處理--即不再呼叫block。如果呼叫dispatch_suspend只是暫停dispatch源。
long dispatch_source_testcancel(dispatch_source_t source); //檢測是否dispatch源被取消,如果返回非0值則表明dispatch源已經被取消
void dispatch_source_set_cancel_handler(dispatch_source_t source, dispatch_block_t cancel_handler); //dispatch源取消時呼叫的block,一般用於關閉檔案或socket等,釋放相關資源
void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler); //可用於設定dispatch源啟動時呼叫block,呼叫完成後即釋放這個block。也可在dispatch源執行當中隨時呼叫這個函式。
相關文章
- iOS多執行緒的初步研究(三)-- NSRunLoopiOS執行緒OOP
- iOS多執行緒的初步研究(四)-- NSTimeriOS執行緒
- 多執行緒學習初步(轉)執行緒
- 對webWorker多執行緒效能的初步探索Web執行緒
- IOS多執行緒iOS執行緒
- iOS 多執行緒iOS執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- iOS多執行緒之執行緒安全iOS執行緒
- iOS多執行緒的使用iOS執行緒
- iOS多執行緒整理iOS執行緒
- iOS-多執行緒iOS執行緒
- iOS多執行緒程式設計之Grand Central Dispatch(GCD)介紹和使用iOS執行緒程式設計GC
- java基礎-多執行緒初步瞭解Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- [iOS] 談談iOS多執行緒的鎖iOS執行緒
- GCD使用dispatch_group_notify、dispatch_group_enter、dispatch_group_leave處理多執行緒同步操作GC執行緒
- iOS 多執行緒總結iOS執行緒
- iOS多執行緒GCD篇iOS執行緒GC
- iOS 多執行緒筆記iOS執行緒筆記
- IOS多執行緒之(GCD)iOS執行緒GC
- iOS 多執行緒之GCDiOS執行緒GC
- iOS 多執行緒介紹iOS執行緒
- iOS 多執行緒-學習iOS執行緒
- iOS多執行緒--NSThreadiOS執行緒thread
- iOS 多執行緒詳解iOS執行緒
- iOS 深入剖析多執行緒iOS執行緒
- iOS多執行緒調研iOS執行緒
- IOS下使用多執行緒iOS執行緒
- IOS 多執行緒技術iOS執行緒
- iOS多執行緒的那些事兒iOS執行緒
- iOS 開發中的多執行緒iOS執行緒
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- 執行緒和程式基礎以及多執行緒的基本使用(iOS)執行緒iOS
- iOS多執行緒:GCD詳解iOS執行緒GC
- iOS 多執行緒記錄(二)iOS執行緒
- iOS 多執行緒記錄(一)iOS執行緒
- iOS 多執行緒之NSOperationiOS執行緒
- iOS 多執行緒之NSThreadiOS執行緒thread