首发于公众号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 行。线程