Eu tenho um monte (~200) as urls de imagens, e eu preciso fazer o download de cada um e, em seguida, o processo de (redimensionar) que, em seguida, atualizar o cache. A coisa é, eu só quero ter no máximo 3 pedidos de uma só vez, e uma vez que as imagens são pesadas, eu também não quero um monte de respostas "pendurado" esperando para ser processado (e tomando memória...).
TLDR eu quero telefonar para o seguinte (4ª) o pedido à rede somente após a receiveValue
no sink
é chamado em um dos 3 primeiros pedidos... (ou seja, após a rede de resposta e processamento de são ambas feitas...).
Será que este fluxo de trabalho, e vai segurar a espera de urls e não soltá-los no chão?
Também eu preciso que buffer()
chamada? Eu uso ele depois de ver esta resposta: 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)
sobre a pia, acabar com a minha assinatura para sempre? (ou seja, ignorando valores futuros emitida)