Swift-多接口請求數(shù)據(jù)

多個請求接口不分順序執(zhí)行,都執(zhí)行完畢之后,再刷新界面:

1、隊列組+信號量

gcd的信號量主要有3個函數(shù),分別為
let semaphore = DispatchSemaphore(value: M)
創(chuàng)建一個值為M的信號量
semaphore.wait()
如果該信號量的值大于0,則使其信號量的值-1,
否則,阻塞線程直到該信號量的值大于0。
semaphore.signal()
釋放信號量,使得該信號量的值加1

// 信號量: 使用信號量來阻塞住發(fā)請求的線程
private let semaphore = DispatchSemaphore(value: 0)
let group = DispatchGroup()

DispatchQueue.global().async(group: group, execute: {[weak self] in
       // 請求1
       xx網(wǎng)絡請求1 {[weak self] (xxxx) in
            // do sth
            self?.semaphore.signal()
       }
       self?.semaphore.wait()
 })
        
DispatchQueue.global().async(group: group, execute: {[weak self] in
        // 請求2
        xx網(wǎng)絡請求2 {[weak self] (xxxx) in
             // do sth
             self?.semaphore.signal()
        }
        self?.semaphore.wait()
 })
 group.notify(queue: DispatchQueue.main) {[weak self] in
     // UI refresh
 }
2、只隊列組(1)

注意:單純用DispatchQueue.global().async(group: group, execute: {[weak self] in xxx })(不加enter和leave, 不加信號量)實現(xiàn)這種順序,前提是閉包里執(zhí)行的代碼得是同步任務才可以(網(wǎng)絡請求異步不可以)。

private let group = DispatchGroup()

DispatchQueue.global().async(group: group, execute: {[weak self] in
       // 請求1
       //通知 group,下個任務要放入 group 中執(zhí)行
      self?.group.enter() 
       xx網(wǎng)絡請求1 {[weak self] (xxxx) in
            // do sth
            // 通知 group,任務成功完成,要移除,與 enter成對出現(xiàn)
           self?.group.leave()
       }
 })
        
DispatchQueue.global().async(group: group, execute: {[weak self] in
        // 請求2
       self?.group.enter()
        xx網(wǎng)絡請求2 {[weak self] (xxxx) in
             // do sth
             self?.group.leave()
        }
 })

 group.notify(queue: DispatchQueue.main) {[weak self] in
     // UI refresh
 }
或者: 只隊列組(2)
private let group = DispatchGroup()

  self.group.enter()
  DispatchQueue.global().async {[weak self] in
       xx網(wǎng)絡請求1 {[weak self] (xxxx) in
            // do sth
            // 通知 group,任務成功完成,要移除,與 enter成對出現(xiàn)
           self?.group.leave()
       }
  }
        
  self.group.enter()
  DispatchQueue.global().async {[weak self] in
        xx網(wǎng)絡請求2 {[weak self] (xxxx) in
             // do sth
             self?.group.leave()
        }
  }
 group.notify(queue: DispatchQueue.main) {[weak self] in
     // UI refresh
 }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Swift006-多線程 相關概念 進程指在系統(tǒng)中正在運行的一個應用程序,進程擁有獨立運行所需的全部資源(例如:正...
    DDY閱讀 859評論 0 2
  • 1,Swift繼續(xù)使用Object-C原有的一套線程,包括三種多線程編程技術: (1)Thread (2)Coco...
    yunxiu閱讀 1,030評論 0 1
  • swift 3中對C層級的GCD的API進行了徹頭徹尾的改變。本文將從實際使用場景來了解一下新的api使用。 di...
    飄金閱讀 476評論 0 1
  • 引言 今天從Books中翻出了“沉淀”已久的關于并發(fā)編程書,讀完之后,感受頗多,有一些不確定的知識點更加清晰了。在...
    SimonMont閱讀 1,761評論 0 4
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,899評論 28 54

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