Swift隊列組、信號量

應(yīng)用場景:一個頁面有6個請求,請求完畢后統(tǒng)一刷新UI

基礎(chǔ)使用:

func initData() -> Void {
        let group = DispatchGroup()
        let queue = DispatchQueue.global()
        
        queue.async(group: group, execute: {
            uLog("11111111")
        })

        queue.async(group: group, execute: {
                uLog("222")
        })

        queue.async(group: group, execute: {
                uLog("3333")
        })

        queue.async(group: group, execute: {
                uLog("4444")
        })
        queue.async(group: group, execute: {
            uLog("555")
        })
        
        ///只要任務(wù)全部完成了,就會在最后調(diào)用
        group.notify(queue: queue) {
            uLog("完結(jié)咯,刷新UI")
        }
    }

結(jié)果:無序輸出,最后輸出完結(jié)

網(wǎng)絡(luò)請求進(jìn)階版:

func initData() -> Void {
        let group = DispatchGroup()
        let queue = DispatchQueue.global()
        
        queue.async(group: group, execute: {
            ///通知 group,下個任務(wù)要放入 group 中執(zhí)行
            group.enter()

            ///模擬網(wǎng)絡(luò)請求
            queue.asyncAfter(deadline: .now() + 4) {
                uLog("11111111")
                ///通知 group,任務(wù)成功完成,要移除,與 enter成對出現(xiàn)
                group.leave()
            }
        })
        queue.async(group: group, execute: {
            group.enter()

             ///模擬網(wǎng)絡(luò)請求
            queue.asyncAfter(deadline: .now() + 1) {
                uLog("222")
                group.leave()
            }
        })

        queue.async(group: group, execute: {
            group.enter()

             ///模擬網(wǎng)絡(luò)請求
            queue.asyncAfter(deadline: .now() + 6) {
                uLog("3333")
                group.leave()
            }
        })
        queue.async(group: group, execute: {
            group.enter()
            
             ///模擬網(wǎng)絡(luò)請求
            queue.asyncAfter(deadline: .now() + 10) {
                uLog("4444")
                group.leave()
            }
        })
        queue.async(group: group, execute: {
            group.enter()
            uLog("555")
            group.leave()
        })
        
        ///只要任務(wù)全部完成了,就會在最后調(diào)用
        group.notify(queue: queue) {
            uLog("完結(jié)咯,刷新UI")
        }
    }

打印結(jié)果:
5,2,1,3,4,完結(jié)

也可用信號量,感覺沒有這樣簡單

信號量

相當(dāng)于一把鎖,信號量為0則阻塞線程,大于0則不會阻塞。則我們通過改變信號量的值,來控制是否阻塞線程,從而達(dá)到線程同步

// 創(chuàng)建一個信號,value:信號量
    let semaphore = DispatchSemaphore.init(value: <#T##Int#>)
    // 某個信號進(jìn)行等待或等待降低信號量,只有當(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容