30 行代碼實現一個 GCD 線程池(簡單)

首發於公衆號git

開發的時候,有時候須要限制任務的最大併發數,好比顯示彈幕、上傳或者下載文件,可是系統的庫裏面沒有提供相似線程池的工具。github

蘋果推薦使用 GCD 的方法來建立線程,由於 GCD 使用簡單並且不須要手動管理線程釋放。swift

那就基於 GCD 來實現一個線程池吧,固然使用上越簡單越好,使用者不須要關心線程的數量,只管往線程裏添加任務就好了。網絡

這個庫的名字叫 SFDispatchQueuePool。併發

好比要發 1000 條彈幕,屏幕上每次最多顯示 10 條,那麼只要限制線程池的最大併發數目是 10 個就好了,用法以下:異步

let sharedPool = SFDispatchQueuePool.pool()

for i in 0...1000 {
  sharedPool.async {
    // 在這裏執行任務
    ...
  }
}
複製代碼

若是執行的任務是異步的呢?好比 URLSession 就是異步執行的。async

也能夠支持,很簡單,只須要把異步變成同步就好了。工具

sharedPool.async {
  let lock = DispatchSemaphore(value: 0)
  let task = URLSession.shared.dataTask(with: URL(string: "https://github.com")!) {data, response, error in
               lock.signal()
             }
  
  task.resume()
  lock.wait()
}
複製代碼

經過信號量等待網絡請求,讓異步變成同步。spa

SFDispatchQueuePool 的代碼只有 30 行。線程

github.com/cntrump/SFD…

相關文章
相關標籤/搜索