Недавно я читаю коды популярной библиотеки кэширования изображений Kingfisher.
Я запутался в использовании GCD на 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()
}
}
}
Каждая барьерная операция будет блокировать друг друга, что делает очередь фактически последовательной. Итак, почему Kingfisher использует очередь concurrent
вместо очереди serial
?
.barrier
, а некоторые нет: github.com/ onevcat/Kingfisher/blob/ - person Rob Napier   schedule 30.03.2018