는 방법을 제한하는 동시에 라이브 URLSessions 와 결합함으로써?

0

질문

가 많이(~200)url 이미지,그리고 내가 다 각각의 하나는,다음 과정을(크기),그 후 업데이트 캐시가 있습니다. 는 것입니다-나는 단지에는 최대 3 요청을 한 번에,그리고 이후 이미지는 무거운 나 또한 원하지 않는 많은 응답을 매달려""기다리를 처리(및 메모리...).

TLDR 고 싶은 호출을 다음(4)네트워크를 요청을 한 후에 만 receiveValuesink 은 중 하나에서 호출의 첫 번째 요청 3 개...(즉,후에 네트워크에 대응 및 처리가 모두 완료...).

이 흐름 작업,그리고 그것에 개최를 기다리고 url 을지에 드롭을 주시기 바랍니다.

또한 필요는 buffer() 전화? 내가 사용하는 그것을 본 후 이 대답: 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(...)
combine swift urlsession
2021-11-23 22:14:45
1

최고의 응답

0

내가 사용하는 것입니다. 이지 않는 최적의 솔루션이지만 그것은 노동 그리고 어쩌면 다른 아이디어를 트리거합니다

var cancellable: AnyCancellable?

var urls: [String] = (0...6).map { _ in "http://httpbin.org/delay/" + String((0...2).randomElement()!) }

var subject: PassthroughSubject<[String], Never> = .init()

let maxConcurrentRequests = 3

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    print(urls)
    
    cancellable = subject
        .flatMap({ urls -> AnyPublisher<[URLSession.DataTaskPublisher.Output], URLError> in
            let requests = urls.map { URLSession.shared.dataTaskPublisher(for: URL.init(string: $0)!) }
            return Publishers.MergeMany(requests)
                .collect().eraseToAnyPublisher()
        })
        .print()
        .sink(receiveCompletion: { completion in
            print(completion)
        }, receiveValue: { value in
            print(value)
            if self.urls.count <= self.maxConcurrentRequests {
                self.urls.removeAll()
                self.subject.send(completion: .finished)
            } else {
                self.urls.removeLast(self.maxConcurrentRequests)
                self.subject.send(self.urls.suffix(self.maxConcurrentRequests))
            }
        })
    
    subject.send(urls.suffix(maxConcurrentRequests))
}
2021-11-24 11:30:11

지 않을 것화 self.subject.send(completion: .finished) 에서 싱크로 끝 구독 forever? (ie 을 무시하고 미래 값을 방출되)
Aviel Gross

@AvielGross 예,그렇습니다. 는 것을 알게 되었을의 컬렉션 url 을 만들어 한 번씩 보기 컨트롤러 제시/해제합니다. 하지 않을 경우 사실이 보내지 마십시오".완료"하지만 당신은 트리거 다음과 같 didSet 에 url 또는 배열을 다시 시작한다.보내기 후에 비우는 배열하고 다시 채우는니다.
Blazej SLEBODA

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................