RxSwift 3.3에서 더블 탭을 정확하게 감지
하고 싶은 일
RxSwift에서 "x초간 아무것도 이벤트가 없으면 지금까지의 값을 정리해 받고 싶다"라는 상황은 자주 있다고 생각합니다.
예를 들면 더블 탭이라고 「0.25초간 아무것도 이벤트가 없었을 때, 그때까지의 탭수가 2회라면 더블 탭이다」라고 판정을 할 수 있습니다.
다른 언어로
RxJS 등에서는 이러한 요구 사항은 buffer
와 debounce
( 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
Reference
이 문제에 관하여(RxSwift 3.3에서 더블 탭을 정확하게 감지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mishimay/items/6e91912b40866e5c6bcb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
RxJS 등에서는 이러한 요구 사항은
buffer
와 debounce
( 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
Reference
이 문제에 관하여(RxSwift 3.3에서 더블 탭을 정확하게 감지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mishimay/items/6e91912b40866e5c6bcb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 OverflowReference
이 문제에 관하여(RxSwift 3.3에서 더블 탭을 정확하게 감지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mishimay/items/6e91912b40866e5c6bcb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)