J'ai beaucoup (~200) url pour les images, et j'ai besoin de télécharger chacun, alors le processus (redimensionner), puis mettre à jour le cache. La chose est - je ne veux avoir au max 3 demandes à la fois, et puisque les images sont lourdes, je ne veux pas beaucoup de réponses "suspendu" en attente de traitement (et de prendre de la mémoire...).
TLDR, je tiens à appeler l'autre (4e) réseau demande qu'après l' receiveValue
dans le sink
est appelée sur l'une des 3 premières demandes... (c'est à dire après le réseau de réponse et de traitement sont à la fois faire...).
Sera-ce des flux de travail, et il va tenir à l'attente des url et ne pas les laisser tomber sur le sol?
Aussi ai-je besoin que buffer()
appel? Je l'utilise après avoir vu cette réponse: 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)
sur l'évier de la fin de mon abonnement pour toujours? (c'est à dire en ignorant les valeurs futures émise)