最近我正在阅读流行的图像缓存库Kingfisher的代码。
我对ImageDownloader
. 在该下载器中,所有ImageFetchLoad
(获取图像的任务)相关操作都被分派到一个名为的并发队列barrierQueue
:
barrierQueue = DispatchQueue(label: "com.onevcat.Kingfisher.ImageDownloader.Barrier.\(name)", attributes: .concurrent)
令人困惑的部分是所有操作都是使用屏障同步调度的:
barrierQueue.sync(flags: .barrier) {
if let URL = task.internalTask.originalRequest?.url, let imageFetchLoad = self.fetchLoads[URL] {
imageFetchLoad.downloadTaskCount -= 1
if imageFetchLoad.downloadTaskCount == 0 {
task.internalTask.cancel()
}
}
}
每个屏障操作都会相互阻塞,这使得队列实际上是一个串行的。因此,为什么翠鸟使用concurrent
队列而不是serial
一个呢?