RxSwift 3.3에서 더블 탭을 정확하게 감지

5920 단어 SwiftRxSwift

하고 싶은 일



RxSwift에서 "x초간 아무것도 이벤트가 없으면 지금까지의 값을 정리해 받고 싶다"라는 상황은 자주 있다고 생각합니다.

예를 들면 더블 탭이라고 「0.25초간 아무것도 이벤트가 없었을 때, 그때까지의 탭수가 2회라면 더블 탭이다」라고 판정을 할 수 있습니다.

다른 언어로



RxJS 등에서는 이러한 요구 사항은 bufferdebounce ( throttle ) 를 조합하면 간단하게 실현할 수 있습니다.
buffer 의 인수에 어떤 타이밍에 이벤트를 정리할지의 조건을 건네줄 수 있으므로, debounce 를 사용해 「x초간 아무것도 없으면」라고 하는 조건을 지정할 수 있습니다.
clickStream.buffer(clickStream.debounce(250))

RxSwift에서



현재 buffer 가 조건을 받을 수 있는 만들기가 되어 있지 않습니다.
그러므로 자기 앞에서 뭔가 다음과 같은 것을 만들어야 합니다 1
extension ObservableType {
    func debouncedBuffer(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> Observable<[E]> {
        var buffer: [E] = []
        return self.do(onNext: { value in
            buffer.append(value)
        }).debounce(dueTime, scheduler: scheduler).flatMap { value -> Observable<[E]> in
            defer { buffer.removeAll() }
            return Observable<[E]>.just(buffer)
        }
    }
}

그러면 이렇게 쓸 수 있습니다.
        button.rx.tap
            .debouncedBuffer(0.25, scheduler: MainScheduler.instance)
            .filter { $0.count == 2 }
            .subscribe(onNext: { _ in
                print("double tap")
            })
            .disposed(by: disposeBag)

참고





2  【번역】당신이 요구하고 있던 리액티브 프로그래밍 입문 - ninjinkun's diary

코드는 이 StackOverflow의 페이지를 참고로 했습니다. buffer swift - Implementing a debounced buffer with RxSwift, is this correct? - Stack Overflow

좋은 웹페이지 즐겨찾기