一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

iOS多線程的初步研究(九)

 方海龍的書館 2015-03-10

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ù)。

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    麻豆精品在线一区二区三区| 亚洲欧美日韩国产自拍| 精品国产亚洲av久一区二区三区| 午夜福利黄片免费观看| 国产又粗又猛又爽又黄| 久一视频这里只有精品| 太香蕉久久国产精品视频| 欧美大粗爽一区二区三区| 国产免费自拍黄片免费看| 国产精品一区二区视频大全| 日韩av生活片一区二区三区| 国产av一区二区三区四区五区| 欧美人妻盗摄日韩偷拍| 国产精品欧美激情在线| 高清一区二区三区四区五区| 久一视频这里只有精品| 国产亚州欧美一区二区| 午夜福利激情性生活免费视频| 欧美日韩视频中文字幕| 99久久精品免费看国产高清| 天堂av一区一区一区| 亚洲成人免费天堂诱惑| 国产精品亚洲一区二区| 亚洲精品偷拍一区二区三区| 激情视频在线视频在线视频| 精品亚洲香蕉久久综合网| 久热这里只有精品九九| 日韩精品一区二区不卡| 人妻少妇系列中文字幕| 99久久人妻中文字幕| 亚洲在线观看福利视频| 午夜免费精品视频在线看| 98精品永久免费视频| 国产精品一区二区传媒蜜臀| 中文字幕人妻一区二区免费 | 亚洲一区二区三区福利视频| 99久只有精品免费视频播放| 欧美日韩国产亚洲三级理论片| 尤物久久91欧美人禽亚洲| 亚洲综合伊人五月天中文| 亚洲中文字幕在线观看四区|