多線程使用中注意的問題: ?
數(shù)據(jù)競(jìng)爭(zhēng): 多個(gè)線程訪問同一個(gè)數(shù)據(jù)源
死鎖:多個(gè)線程相互等待對(duì)方的完成
太多的線程將導(dǎo)致消耗大量的內(nèi)存
對(duì)于 長(zhǎng)時(shí)間的處理不應(yīng)放在主線程中乘盖,否則會(huì)導(dǎo)致主線程阻塞焰檩,界面卡頓
dispatch_async(dispatch_queue,block)
dispatch_queue包含兩種:?
serial queue:顧名思義按順序執(zhí)行添加到它里面的block
Concurrent queue:并行的執(zhí)行添加到它里面的block
dispatch_queue的生成:
第一種生成方法: ? dispatch_queue_create (para1,para2) 返回值類型為:dispatch_queue_t
para1: dispatch_queue 名稱
para2: DISPATCH_QUEUE_CONCURRENT 生成的queue為并行,NULL 生成的queue為串行
用這種方式生成的queue需要手動(dòng)釋放订框,用dispatch_release(dispatch_queue_name)
生成serial dispatch queue可以有效避免數(shù)據(jù)競(jìng)爭(zhēng)析苫,因此在對(duì)同一數(shù)據(jù)源更新時(shí)應(yīng)使用serial dispatch queue.生成大量的serial dispatch queue會(huì)導(dǎo)致內(nèi)存消耗加劇,影響性能
第二種:獲取系統(tǒng)提供的dispatch_queue: main_dispatch_queue與global_dispatch_queue
用dispatch_queue_create創(chuàng)建的queue 具有與dispatch_global_queue默認(rèn)優(yōu)先級(jí)相同的優(yōu)先級(jí)穿扳,如果需要更改起優(yōu)先級(jí)衩侥,用函數(shù):dispatch_set_target_queue(para1,para2)
para1: 需要更改優(yōu)先級(jí)的queue,只能是用dispatch_queue_create創(chuàng)建的queue
para2: 類型為diapatch_queue_t
dispatch_after: 在指定時(shí)間后執(zhí)行處理
dispatch_group: 多個(gè)處理結(jié)束后,執(zhí)行結(jié)束處理
diapatch_group_notify(group,
dispatch_group_wait(group,DISPATCH_TIME_FOREVER)其中DISPATCH_TIEM_FOREVER為等待時(shí)間矛物,永久等待茫死,只要添加到dispatch_group中的任務(wù)沒有完成,將一直等下去
也可以指定時(shí)間:其類型應(yīng)為dispatch_time_t 類型
如指定一秒:dispatch_time_t time = dispatch_time_t (dispatch_time_now, 1ull *NSEC_PER_SEC)
long result = ?dispatch_group_wait(group,time)
if result == 0{
// 所有的任務(wù)在指定時(shí)間內(nèi)完成
}else {
//至少有一個(gè)任務(wù)沒有在指定時(shí)間內(nèi)完成
}
所謂的等待履羞,是指調(diào)用dispatch_group_wait()函數(shù)的線程停止
?執(zhí)行完成后釋放:dispatch_release(group)
dispatch_barrizer_async: 解決在寫入操作沒有結(jié)束情況下峦萎,讀取操作不可執(zhí)行的問題
dispatch_barrizer_async 函數(shù)會(huì)等待追加到Concurrent dispatch_quue中的并行執(zhí)行的處理完成之后,在講指定的處理追加到concurrent dispatch queue 中并執(zhí)行完畢之后忆首,才會(huì)執(zhí)行concurrent ?dispatch queue中未完成的任務(wù)
dispatch_apply :該函數(shù)按照的指定次數(shù)追加指定的block到指定的dispatch_queue中爱榔,并等待全部處理執(zhí)行結(jié)束
通常與dispatch_async()結(jié)合使用
dispatch_suspend(queue):掛起指定的dispatch_queue
對(duì)正在改queue中執(zhí)行的任務(wù)沒有影響,但該任務(wù)執(zhí)行完成后糙及,后面的任務(wù)將停止執(zhí)行
dispatch_resume(queue): 恢復(fù)指定的dispatch_queue
恢復(fù)之后详幽,該queue中未執(zhí)行的任務(wù)將繼續(xù)執(zhí)行
dispatch_semaphore: 更好的處理并行更新數(shù)據(jù),產(chǎn)生數(shù)據(jù)不一致的問題
dispatch_semaphore:是持有計(jì)數(shù)的信號(hào)浸锨,所謂信號(hào)唇聘,類似于過馬路時(shí)的手旗,當(dāng)旗子舉起時(shí)柱搜,禁止通行迟郎,當(dāng)旗子放下時(shí),放行聪蘸。在dispatch中宪肖,計(jì)數(shù)等于0時(shí)炒嘲,等待,大于1或?yàn)橐粫r(shí)匈庭,減去一而不等待
?用dispatch_semaphore_create來創(chuàng)建dispatch_semaphore
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1)
參數(shù)表示計(jì)數(shù)初始值。必須通過dispatch_release釋放浑劳,dispatch_retain持有
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER)
該函數(shù)用于等待semaphore的記數(shù)值大于或等于一時(shí)該函數(shù)返回并且計(jì)數(shù)值減一
dispatch_semaphore_signal(semaphore) 使得semaphore計(jì)數(shù)值加一
Dispatch_once:在應(yīng)用中只執(zhí)行一次指定處理的API
Dispatch I/O ?當(dāng)讀取較大的文件時(shí)阱持,將大文件分塊,用多線程并行讀取