RxSwift로 좋은 느낌으로 Queue 처리하는 RxObservableQueue를 만들었다

3634 단어 SwiftRxSwift

요약



RxObservableQueue (Carthage, Cocoapods 대응 )
Observable에서 emit 된 item을 queue로 유지하고 원하는 타이밍에 원하는 병렬 수로 꺼낼 수 있습니다.
(알기 힘든 )

좀 더 이해하기 쉬운 유스 케이스



예를 들어, 사용자 조작에 대해 대량의 객체를 네트워크에서 미리 읽을 때 사용할 수 있습니다.
아메쿠루 에서 사용하기 위해 만들었습니다. 여기의 요구 사항은 다음과 같습니다.
  • 표시된지도 영역의 현재 시간 (10 장 정도)의 이미지를 최우선으로 얻습니다.
  • 미래의 시간축 12개분(합계 120장 정도)을 현재 시각에 가까운 순서로 취득한다
  • 과거의 시간축 12개분(합계 120장 정도)을 현재 시각에 가까운 순서로 취득한다
  • 사용자가 표시 영역을 변경하면 ↑의 취득 처리는 모두 취소
  • 취득 · 화상 처리는 부하가 높기 때문에 동시 처리 수는 제한하고 싶다

  • 상기의 처리를 이런 느낌으로 걸게 됩니다.
    // 例: Observable<MKMapRect> ユーザが地図領域を変更するとemitされるObservable
    visibleMapRect 
        // 地図領域をflatMapLatestし、最後の地図領域分以外はdispose()する
        .flatMapLatest { mapRect -> Observable<(Request, Counter)> in 
            // 地図領域から、先読み処理に必要な情報が入ったRequestをemitするObservableを作成する
            let request: Observable<Request> = makeRequest(mapRect)
    
            // RxObservableQueueで同時実行数3でキュー作成
            return RxObservableQueue.create(observable: request, maxConcurrentCount: 3)
        }
        .subscribe(onNext: { request, counter in
            // 同時実行数を超えない様にrequestがemitされる
            // 処理が終わったらコンプリーションハンドラでcounter.signal()すると、次のrequestがemitされる
            model.process(request, completionHandler: { counter.signal() })
        })
        .addDisposableTo(bag)
    

    좋은 웹페이지 즐겨찾기