swift GCD常用方法記錄一下

創(chuàng)建DispatchQueue

// 與當(dāng)前進程的主線程相關(guān)聯(lián)的調(diào)度隊列, 即主隊列滩届。
class var main: DispatchQueue { get }

// 返回一個系統(tǒng)全局隊列
class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue

/**
* 創(chuàng)建一個派發(fā)隊列才菠。
* label:隊列的唯一標(biāo)識渠欺。
* qos  :決定了系統(tǒng)安排任務(wù)執(zhí)行的優(yōu)先級虱颗。
* attributes : 執(zhí)行隊列的執(zhí)行方式高蜂,串行還是并行聪黎。
* autoreleaseFrequency : 指示隊列自動釋放對象的頻率的常量。
* target : 計劃執(zhí)行blocks的目標(biāo)隊列备恤。如果希望系統(tǒng)提供適合當(dāng)前對象的隊列稿饰,請指定DISPATCH_TARGET_QUEUE_DEFAULT。
*/
convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil)

// 獲取主隊列
let mainQueue = DispatchQueue.main
// 獲取全局隊列
let globalQueue = DispatchQueue.global()
// 自定義一個并行隊列
let customConcurrentQueue = DispatchQueue(label: "com.queue.concurrent", qos: .unspecified, attributes: [.concurrent], autoreleaseFrequency: .inherit, target: nil)
// 自定義一個串行隊列露泊,attributes不賦值即是串行喉镰。
let serialConcurrentQueue = DispatchQueue(label: "com.queue.serial", qos: .unspecified, attributes: [], autoreleaseFrequency: .inherit, target: nil)
print("mainQueue is \(mainQueue)")
print("globalQueue is \(globalQueue)")
print("customConcurrentQueue is \(customConcurrentQueue)")
print("serialConcurrentQueue is \(serialConcurrentQueue)")

輸出結(jié)果:
mainQueue is <OS_dispatch_queue_main: com.apple.main-thread>
globalQueue is <OS_dispatch_queue_global: com.apple.root.default-qos>
customConcurrentQueue is <OS_dispatch_queue_concurrent: com.queue.concurrent>
serialConcurrentQueue is <OS_dispatch_queue_serial: com.queue.serial>

//異步執(zhí)行任務(wù)主要有以下這些方法:
//wallDeadline 和 deadline,當(dāng)系統(tǒng)睡眠后,wallDeadline會繼續(xù)惭笑,但是deadline會被掛起侣姆。例如:設(shè)置參數(shù)為60分鐘,當(dāng)系統(tǒng)睡眠50分鐘脖咐,wallDeadline會在系統(tǒng)醒來之后10分鐘執(zhí)行铺敌,而deadline會在系統(tǒng)醒來之后60分鐘執(zhí)行。
// 立即執(zhí)行派發(fā)的任務(wù)屁擅,并立即return偿凭。
func async(execute: DispatchWorkItem)
// 在指定的時間執(zhí)行派發(fā)的任務(wù),并立即return派歌。
func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)
// 在指定的時間執(zhí)行派發(fā)的任務(wù)的block弯囊,并立即return。
func asyncAfter(deadline: DispatchTime, qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], execute work: @escaping @convention(block) () -> Void)
// 在指定的時間后執(zhí)行派發(fā)的任務(wù)胶果,并立即return匾嘱。
func asyncAfter(wallDeadline: DispatchWallTime, execute: DispatchWorkItem)
// 在指定的時間后執(zhí)行派發(fā)的任務(wù)的block,并立即return早抠。
func asyncAfter(wallDeadline: DispatchWallTime, qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], execute work: @escaping @convention(block) () -> Void)


同步任務(wù)+串行隊列

(沒有開啟新線程霎烙,串行執(zhí)行任務(wù),當(dāng)前線程(主線程)中運行)

     let queue1 = DispatchQueue(label: "queue")
     print("begin")
     queue1.sync {
         print("線程1運行")
     }
     queue1.sync {
         print("線程2運行")
     }
     print("end")
     /*
      begin
      線程1運行
      線程2運行
      end
      */

同步任務(wù)+并發(fā)隊列

(沒有開啟新線程蕊连,串行執(zhí)行任務(wù)悬垃,當(dāng)前線程(主線程)中運行)

       let queue2 = DispatchQueue(label: "queue1", attributes: .concurrent)
       print("begin")
       queue2.sync {
           print("線程1運行")
       }
       queue2.sync {
           print("線程2運行")
       }
       print("end")
       /*
        begin
        線程1運行
        線程2運行
        end
        */

異步任務(wù)+串行隊列

(開啟1條新線程,串行執(zhí)行任務(wù)甘苍,開啟1條新線程中運行)

        let queue3 = DispatchQueue(label: "queue")
        print("begin")
        queue3.async {
            print("線程1運行")
        }
        queue3.async {
            print("線程2運行")
        }
        print("end")
        /*
         begin
         end
         線程1運行
         線程2運行
         */

異步任務(wù)+并發(fā)隊列

(開啟2條新線程尝蠕,并發(fā)執(zhí)行任務(wù),2條新線程中運行)

        let queue4 = DispatchQueue(label: "queue1", attributes: .concurrent)
        print("begin")
        queue4.async {
            print("線程1運行")
        }
        queue4.async {
            print("線程2運行")
        }
        print("end")
        /*
         begin
         end
         線程1運行
         線程2運行
         */

項目中用到的

        //1.延遲執(zhí)行
        //DispatchTime.now() 獲取當(dāng)前時間
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
            //需要進行的操作
        }
        //2.異步進行耗時操作,主線程進行用戶交互以及刷新UI的操作
        //開啟一個全局的異步隊列
        DispatchQueue.global().async {
            //耗時操作
            DispatchQueue.main.async {
                //進行UI刷新和用戶交互
            }
        }
        //3.處理多數(shù)據(jù)請求,所有請求完畢進行UI更新
        //創(chuàng)建工作組
        let workingGroup = DispatchGroup()

        //創(chuàng)建隊列
        let workingQueue = DispatchQueue(label: "requestData", attributes: .concurrent)

        //第一個網(wǎng)絡(luò)請求
        workingGroup.enter()
        workingQueue.async {
            //進行數(shù)據(jù)請求1
            workingGroup.leave()
        }
        //第二個網(wǎng)絡(luò)請求
        workingGroup.enter()
        workingQueue.async {
            //進行數(shù)據(jù)請求2
            workingGroup.leave()
        }
        //請求完畢
        workingGroup.notify(queue: .main) {
            //進行UI的更新
        }

信號量

相當(dāng)于一把鎖载庭,信號量為0則阻塞線程看彼,大于0則不會阻塞廊佩。則我們通過改變信號量的值,來控制是否阻塞線程靖榕,從而達到線程同步
// 創(chuàng)建一個信號标锄,value:信號量
    let semaphore = DispatchSemaphore.init(value: <#T##Int#>)
    // 某個信號進行等待或等待降低信號量,只有當(dāng)信號量大于0時才會停止等待,繼續(xù)向下執(zhí)行
    semaphore.wait()
    // 使某個信號的信號量+1
    semaphore.signal()
func semaphore_demo() {
    let queue = DispatchQueue.global()
    //創(chuàng)建信號量  值為1  意思是最大并發(fā)數(shù)為1序矩,任務(wù)只能一個接一個執(zhí)行
    let semaphore = DispatchSemaphore.init(value: 1)
    
    //此時信號量為1鸯绿,無需等待,向下執(zhí)行 信號量 1->0
    semaphore.wait()
    queue.asyncAfter(deadline: .now() + 4) {
        print("1111")
        //延遲4秒后輸出1111簸淀,釋放信號量瓶蝴,信號量 從0->1
        semaphore.signal()
    }
    
    //延遲4秒輸出1111后,此時信號量為1租幕,繼續(xù)向下執(zhí)行  同上操作舷手。。劲绪。
    semaphore.wait()
    queue.asyncAfter(deadline: .now() + 10) {
        print("2222")
        semaphore.signal()
    }
    
    semaphore.wait()
    queue.asyncAfter(deadline: .now() + 2) {
        print("3333")
        semaphore.signal()
    }
    
    semaphore.wait()
    queue.asyncAfter(deadline: .now() + 1) {
        print("4444")
        semaphore.signal()
    }
    
    semaphore.wait()
    queue.asyncAfter(deadline: .now() + 6) {
        print("5555")
        semaphore.signal()
    }
    
    semaphore.wait()
    print("任務(wù)全部完成")
    semaphore.signal()
}
輸出
1111
2222
3333
4444
5555
任務(wù)全部完成
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末男窟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贾富,更是在濱河造成了極大的恐慌歉眷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颤枪,死亡現(xiàn)場離奇詭異汗捡,居然都是意外死亡,警方通過查閱死者的電腦和手機畏纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門扇住,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盗胀,你說我怎么就攤上這事艘蹋。” “怎么了票灰?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵女阀,是天一觀的道長。 經(jīng)常有香客問我屑迂,道長浸策,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任屈糊,我火速辦了婚禮,結(jié)果婚禮上琼了,老公的妹妹穿的比我還像新娘逻锐。我一直安慰自己夫晌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布昧诱。 她就那樣靜靜地躺著晓淀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盏档。 梳的紋絲不亂的頭發(fā)上凶掰,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音蜈亩,去河邊找鬼懦窘。 笑死,一個胖子當(dāng)著我的面吹牛稚配,可吹牛的內(nèi)容都是我干的畅涂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼道川,長吁一口氣:“原來是場噩夢啊……” “哼午衰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冒萄,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤臊岸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尊流,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帅戒,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年奠旺,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜘澜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡响疚,死狀恐怖鄙信,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忿晕,我是刑警寧澤装诡,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站践盼,受9級特大地震影響鸦采,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咕幻,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一渔伯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肄程,春花似錦锣吼、人聲如沸选浑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽古徒。三九已至,卻和暖如春读恃,著一層夾襖步出監(jiān)牢的瞬間隧膘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工寺惫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疹吃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓肌蜻,卻偏偏與公主長得像互墓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒋搜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容