dispatch源(dispatch source)和RunLoop源概念上有些類似的地方,而且使用起來更簡(jiǎn)單。要很好地理解dispatch源,其實(shí)把它看成一種特別的生產(chǎn)消費(fèi)模式。dispatch源好比生產(chǎn)的數(shù)據(jù),當(dāng)有新數(shù)據(jù)時(shí),會(huì)自動(dòng)在dispatch指定的隊(duì)列(即消費(fèi)隊(duì)列)上運(yùn)行相應(yīng)地block,生產(chǎn)和消費(fèi)同步是dispatch源會(huì)自動(dòng)管理的。 dispatch源的使用基本為以下步驟: 1. dispatch_source_t source = dispatch_source_create(dispatch_source_type, handler, mask, dispatch_queue); //創(chuàng)建dispatch源,這里使用加法來合并dispatch源數(shù)據(jù),最后一個(gè)參數(shù)是指定dispatch隊(duì)列 2. dispatch_source_set_event_handler(source, ^{ //設(shè)置響應(yīng)dispatch源事件的block,在dispatch源指定的隊(duì)列上運(yùn)行 //可以通過dispatch_source_get_data(source)來得到dispatch源數(shù)據(jù) }); 3. dispatch_resume(source); //dispatch源創(chuàng)建后處于suspend狀態(tài),所以需要啟動(dòng)dispatch源 4. dispatch_source_merge_data(source, value); //合并dispatch源數(shù)據(jù),在dispatch源的block中,dispatch_source_get_data(source)就會(huì)得到value。 是不是很簡(jiǎn)單?而且完全不必編寫同步的代碼。比如網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)的模式,就可以這樣來寫: 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), ^{ //網(wǎng)絡(luò)請(qǐng)求 dispatch_source_merge_data(source, 1); //通知隊(duì)列 }); dispatch源還支持其它一些系統(tǒng)源,包括定時(shí)器、監(jiān)控文件的讀寫、監(jiān)控文件系統(tǒng)、監(jiān)控信號(hào)或進(jìn)程等,基本上調(diào)用的方式原理和上面相同,只是有可能是系統(tǒng)自動(dòng)觸發(fā)事件。比如dispatch定時(shí)器: 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秒觸發(fā)timer,誤差1秒 dispatch_source_set_event_handler(timer, ^{ //定時(shí)處理 }); dispatch_resume(timer); 其它情況的dispatch源就不再一一舉例,可參看官網(wǎng)有具體文檔: https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html#//apple_ref/doc/uid/TP40008091-CH103-SW1
最后,dispatch源的其它一些函數(shù)大致羅列如下: uintptr_t dispatch_source_get_handle(dispatch_source_t source); //得到dispatch源創(chuàng)建,即調(diào)用dispatch_source_create的第二個(gè)參數(shù) unsignedlong dispatch_source_get_mask(dispatch_source_t source); //得到dispatch源創(chuàng)建,即調(diào)用dispatch_source_create的第三個(gè)參數(shù) void dispatch_source_cancel(dispatch_source_t source); //取消dispatch源的事件處理--即不再調(diào)用block。如果調(diào)用dispatch_suspend只是暫停dispatch源。 long dispatch_source_testcancel(dispatch_source_t source); //檢測(cè)是否dispatch源被取消,如果返回非0值則表明dispatch源已經(jīng)被取消 void dispatch_source_set_cancel_handler(dispatch_source_t source, dispatch_block_t cancel_handler); //dispatch源取消時(shí)調(diào)用的block,一般用于關(guān)閉文件或socket等,釋放相關(guān)資源 void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler); //可用于設(shè)置dispatch源啟動(dòng)時(shí)調(diào)用block,調(diào)用完成后即釋放這個(gè)block。也可在dispatch源運(yùn)行當(dāng)中隨時(shí)調(diào)用這個(gè)函數(shù)。
|
|