Ho un sacco (~200) gli url per le immagini, e ho bisogno di scaricare ogni uno, poi il processo (ridimensionare), quindi aggiornare la cache. Il fatto è che - voglio solo avere al max 3 richieste in una sola volta, e dato che le immagini sono pesanti, anche io non voglio un sacco di risposte "sospesa" in attesa di essere processato (e l'assunzione di memoria...).
TLDR voglio chiamare la prossima (4) richiesta di rete solo dopo il receiveValue
nel sink
è chiamato uno dei primi 3 richieste... (cioè dopo la risposta della rete & l'elaborazione sono sia fatto...).
Questo flusso di lavoro, e potrà contenere l'attesa url e non farli cadere sul pavimento?
Inoltre ho bisogno che buffer()
chiamata? Io lo uso dopo aver visto questa risposta: 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)
sul lavandino fine il mio abbonamento per sempre? (ie ignorando i valori futuri emessa)