Mám veľa (~200) adresy url pre obrázky, a musím stiahnuť každý jeden, potom proces (zmena veľkosti), potom aktualizácia vyrovnávacej pamäte. Vec je - ja len chcem mať na max 3 žiadosti naraz, a pretože obrázky sú ťažké, ja tiež nechcem veľa odpovedí "visí" čaká na spracovanie (a pri pamäť...).
TLDR chcem pozvať, aby next (4) siete požiadať len po receiveValue
v sink
nazýva sa na jednej z prvých 3 žiadosti... (tj po sieti odpoveď a spracovanie sú tak vykonať...).
Bude tento tok práce, a bude to držať čaká adresy url, a nie klesnúť ich na zem?
Tiež musím, že buffer()
hovor? Používam to, čo videl táto odpoveď: 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)
na umývadlo konci môjho predplatné navždy? (tj ignorovanie budúce hodnoty emitovaného)