Mam dużo (~200) adresów URL do zdjęć, i muszę pobrać każdy z nich, następnie przetworzyć (zmień rozmiar), a następnie odśwież cache. Rzecz w tym, że chcę mieć nie więcej niż 3 zapytań jednocześnie, i, ponieważ obrazy ciężkie, ja również nie chcę, aby wiele odpowiedzi "зависало" w oczekiwaniu na traktowanie (i trwała pamięć...).
TLDR chcę wywołać następny (4) żądania sieci tylko po receiveValue
w sink
wywoływana jest przez jednego z pierwszych 3 zapytań... (czyli po tym, jak karta odpowiedzi i przetwarzanie zostaną spełnione...).
Czy ten przepływ pracy, i czy będzie trzymać się za czekające adresy URL i nie upuścić je na podłodze?
Oraz czy muszę to buffer()
zadzwonić? Używam go po tym, jak zobaczył tę odpowiedź: 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 zlewie na zawsze skończy się mój abonament? (czyli ignorowanie przyszłych wartości, promieniowanych)