Görüntüler için çok fazla (~200) url'm var ve her birini indirmem, sonra işlemem (yeniden boyutlandırmam) ve ardından önbelleği güncellemem gerekiyor. Mesele şu ki-sadece bir kerede en fazla 3 istekte bulunmak istiyorum ve görüntüler ağır olduğundan, işlenmeyi bekleyen (ve bellek alan) çok fazla yanıtın "askıda kalmasını" istemiyorum...).
TLDR Bir sonraki (4.) ağ isteğini yalnızca receiveValue
in the sink
ilk 3 istekten birinde çağrılır... (yani, ağ yanıtı ve işlemden sonra her ikisi de yapılır...).
Bu akış işe yarayacak mı ve bekleyen url'leri tutacak ve onları yere düşürmeyecek mi?
Ayrıca buna ihtiyacım var mı buffer()
Ara? Bu cevabı gördükten sonra kullanıyorum: 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)
aboneliğim sonsuza dek sona erecek mi? (yani, gelecekteki değerleri görmezden gelmek)