**:
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, ^);
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_resume(source);
dispatch_async(dispatch_get_global_queue(0,
0), ^);
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源的其它一些函式大致羅列如下:
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_tcancel_handler);//dispatch源取消時呼叫的block,一般用於關閉檔案或socket等,釋放相關資源
void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_tregistration_handler);//可用於設定dispatch源啟動時呼叫block,呼叫完成後即釋放這個block。也可在dispatch源執行當中隨時呼叫這個函式。
iOS多執行緒
iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...
iOS多執行緒
iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...
iOS多執行緒
iphone 中的執行緒應用並不是無節制的,官方給出的資料顯示iphone os下的主線程的堆疊大小是1m,第二個執行緒開始都是512kb。並且該值不能通過編譯器開關或執行緒api函式來更改。只有主線程有直接修改ui的能力。一 nsoperation和nsoperationqueue 1 乙個繼承自...