首發於公衆號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 行。線程