У меня есть много (~200) URL-адресов для изображений, и мне нужно загрузить каждое из них, затем обработать (изменить размер) его, а затем обновить кэш. Дело в том, что я хочу иметь не более 3 запросов одновременно, и, поскольку изображения тяжелые, я также не хочу, чтобы много ответов "зависало" в ожидании обработки (и занимало память...).
TLDR Я хочу вызвать следующий (4-й) сетевой запрос только после receiveValue
в sink
вызывается по одному из первых 3 запросов... (т. е. после того, как сетевой ответ и обработка будут выполнены...).
Будет ли этот поток работать, и будет ли он держаться за ожидающие URL-адреса и не уронить их на пол?
Также нужно ли мне это buffer()
позвонить? Я использую его после того, как увидел этот ответ: https://stackoverflow.com/a/67011837/2242359
wayTooManyURLsToHandleAtOnce // this is a `[URL]`
.publisher
.buffer(size: .max, prefetch: .byRequest, whenFull: .dropNewest) // NEEDED?
.flatMap(maxPublishers: .max(3)) { url in
URLSession.shared
.dataTaskPublisher(for: url)
.map { (data: Data, _) -> Picture in
Picture(from: data)
}
}
.tryCompactMap {
resizeImage(picture: $0) // takes a while and might fail
}
.receive(on: DispatchQueue.main)
.sink { completion
// handling completion...
} receiveValue: { resizedImage
self.cache.append(resizedImage)
}
.store(...)
self.subject.send(completion: .finished)
на раковине навсегда закончится моя подписка? (т. е. игнорирование будущих значений, излучаемых)