背景:開發(fā)人員在需要開啟線程處理任務(wù)時弃酌,大多都采用了全局隊(duì)列默認(rèn)優(yōu)先級來處理,所以項(xiàng)目中積累了大量的全局隊(duì)列默認(rèn)優(yōu)先級锦积,導(dǎo)致了一人干活,全家圍觀瓶殃。
項(xiàng)目中通常采取的都是異步主隊(duì)列操作或者異步全局隊(duì)列操作充包,卻并未涉及到創(chuàng)建同步隊(duì)列;查閱Apple文檔后發(fā)現(xiàn)dispatch_queue_attr_t屬性遥椿,可以用來創(chuàng)建同步隊(duì)列,然后再去異步或者同步執(zhí)行線程淆储;
異步主隊(duì)列操作:
dispatch_async(dispatch_get_main_queue(), ^{});
異步全局隊(duì)列操作:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});
異步同步隊(duì)列:
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, -1);
dispatch_queue_t queue = dispatch_queue_create("com.lotus.LCQueueForUserInteractive", attr);
dispatch_async(attr, ^{});
為解決背景問題冠场,我們設(shè)定不同的優(yōu)先級,創(chuàng)建與CPU核數(shù)相等的串行隊(duì)列本砰,通過優(yōu)先級的合理使用和串行隊(duì)列的調(diào)度碴裙,充分利用時間片和多核的效率,同時不出現(xiàn)相關(guān)副作用的情況下實(shí)現(xiàn)多線程操作点额。
QOS_CLASS_USER_INTERACTIVE 0x21, 用戶交互(希望盡快完成舔株,用戶對結(jié)果很期望,不要放太耗時操作)
QOS_CLASS_USER_INITIATED 0x19, 用戶期望(不要放太耗時操作)
QOS_CLASS_DEFAULT 0x15, 默認(rèn)(不是給程序員使用的还棱,用來重置對列使用的)
QOS_CLASS_UTILITY 0x11, 實(shí)用工具(耗時操作载慈,可以使用這個選項(xiàng))
QOS_CLASS_BACKGROUND 0x09, 后臺
QOS_CLASS_UNSPECIFIED 0x00, 未指定
*/
/// 與用戶交互的任務(wù),這些任務(wù)通常跟UI級別的刷新相關(guān)珍手,比如動畫办铡,cell高度辞做,frame等UI的計(jì)算
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForUserInteractive(void){
// 自定義隊(duì)列的優(yōu)先級 <創(chuàng)建串行隊(duì)列,通過優(yōu)先級的合理使用和串行隊(duì)列的調(diào)度,充分利用時間片和多核的效率>
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, -1);
return dispatch_queue_create("com.lotus.LCQueueForUserInteractive", attr);;
}
/// 由用戶發(fā)起的并且需要立即得到結(jié)果的任務(wù)寡具,比如讀取數(shù)據(jù)(配置秤茅,用戶信息等)來加載UI,會在幾秒或者更短的時間內(nèi)完成
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForUserInitiated(void){
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1);
return dispatch_queue_create("com.lotus.LCQueueForUserInitiated", attr);;
}
/// 一些耗時的任務(wù)童叠,比如復(fù)雜的組合的網(wǎng)絡(luò)請求框喳,圖片下載,上傳
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForUtility(void){
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, -1);
return dispatch_queue_create("com.lotus.LCQueueForUtility", attr);;
}
/// 對用戶不可見厦坛,可以長時間在后臺運(yùn)行帖努,比如,拉取配置粪般,地理位置上報拼余,日志上報等
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForBackground(void){
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_BACKGROUND, -1);
return dispatch_queue_create("com.lotus.LCQueueForBackground", attr);;
}
/// 默認(rèn),不推薦作為首選使用
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForDefault(void){
return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
}