Am o mulțime (~200) url-uri pentru imagini, și am nevoie să descărcați fiecare, apoi procesul (redimensionare), apoi actualizați cache-ul. Chestia e că vreau doar să aibă la maxim 3 cereri de la o dată, și când imaginile sunt grele, de asemenea, nu vreau o mulțime de răspunsuri "agățat" de așteptare pentru a fi prelucrate (și luarea de memorie...).
TLDR vreau pentru a apela următorul (4) cererea de rețea numai după receiveValue
în sink
este numit pe unul dintre primele 3 cereri (de exemplu, după ce rețeaua de răspuns și prelucrare sunt atât de terminat...).
Va acest flux de lucru, și va ține în așteptare url-uri și să nu drop-le pe podea?
De asemenea, am nevoie de asta buffer()
apel? Îl folosesc după ce a văzut acest răspuns: 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)
pe chiuveta sfârșitul abonamentul meu pentru totdeauna? (de exemplu, ignorând valorile viitoare emise)