RxSwift 일정한 간격으로 1문자씩 String을 흘린다(입력한다)

5204 단어 iOSSwiftRxSwift

TL;DR



String을 1문자씩 일정 간격으로, UILabel나 UITextView에 흘려 넣고 싶다.
「1문자씩」, 「일정 간격으로」……, 이것은 Rx가 잘할 것 같은 녀석이다. 전형적인 스트림의 문제다.
그런 이렇게 구현 예가 좀처럼 발견되지 않았기 때문에, 생각해 보았습니다.

완성은 이쪽↓


구현 예



아래의 예에서는 0.05초 간격으로 1문자씩 흘려 갑니다.
    @IBAction func didTapButton(_ sender: UIButton) {
        label.text = nil

        let lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
        let text  = Observable.just(lorem)
        let timer = Observable<Int>.interval(0.05, scheduler: MainScheduler.instance)

        _ = Observable.combineLatest(timer, text)
            .takeWhile { (i, t)  in
                i < t.characters.count
            }
            .flatMapLatest { (i, t) -> Observable<String> in
                let characters = Array(t.characters)
                let character = characters[i]
                return Observable.just("\(character)")
            }
            .subscribe(onNext: { [weak self] (character) in
                let currentText = self?.label.text ?? ""
                self?.label.text = currentText + character
            })
    }

포인트는 takeWhile입니다.
i 가 문자수 이상이 되면 completed 가 불려 순서가 terminate 됩니다.subscribe { print($0) }로 바꾸면 completed가 호출되는 것을 볼 수 있습니다.
next(L)
next(o)
next(r)
// ...
completed

좋은 웹페이지 즐겨찾기