RxSwift 일정한 간격으로 1문자씩 String을 흘린다(입력한다)
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
Reference
이 문제에 관하여(RxSwift 일정한 간격으로 1문자씩 String을 흘린다(입력한다)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mshrwtnb/items/d854f535cb0cf7f27c86
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래의 예에서는 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
Reference
이 문제에 관하여(RxSwift 일정한 간격으로 1문자씩 String을 흘린다(입력한다)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mshrwtnb/items/d854f535cb0cf7f27c86텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)