Tengo un montón (~200) direcciones url de las imágenes, y necesito descargar de cada uno, entonces el proceso (cambiar el tamaño), luego de la actualización de la memoria caché. La cosa es que solo me quiere para tener en un máximo de 3 solicitudes a la vez, y dado que las imágenes son pesadas, yo también no quiero un montón de respuestas de "colgar" en espera de ser procesados (y teniendo memoria...).
TLDR quiero llamar a la siguiente (4º) solicitud de red sólo después de que el receiveValue
en el sink
se llama en uno de los primeros 3 pedidos... (es decir, después de la respuesta de la red y procesamiento son de hecho...).
Será este flujo de trabajo, y se aferran a la espera de la url y no caer en el piso?
También necesito que buffer()
llame? Yo lo uso después de ver esta respuesta: 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)
en el lavabo de terminar mi suscripción para siempre? (es decir, ignorando el futuro de los valores emitidos)