##前提
UITextViewに入力されたものから新しく入力されてハッシュタグを抽出するのをRxSwfitでやってみました。ReplaySubjectはあまり話題に上がらないので、こういう使い方ができるのを知っていただければと思います。
##手順
- UITextView.textとReplaySubjectをバインドする。
let differenceTxtSubject = ReplaySubject<String>.create(bufferSize: 1)
txtView.rx.text
.debounce(.milliseconds(300), scheduler: MainScheduler.instance)
.bind(to: differenceTxtSubject)
.dispose(by: disposeBag)
ReplaySubjectはバッファされた分だけ遡ることができる。この場合はバッファサイズは1なので、1個前に流れてきたものと現在のものを比べることができる。
- 前回のものと今回のものを配列化し、今回の配列の中で前回の配列に入ってない要素を抽出するObservableを用意する。
var searchingQuery: Observable<String> {
return Observable.zip(differenceTxtSubject, differenceTxtSubject.skip(1)) { previous, current in
var previousNoHashTagArr = previous.components(separatedBy: "#").filter { $0 != "" }
previousNoHashTagArr = previousNoHashTagArr.map { $0.filter { char in
return char != " "
} }
var currentNoHashTagArr = current.components(separatedBy: "#").filter { $0 != "" }
currentNoHashTagArr = currentNoHashTagArr.map { $0.filter { char in
return char != " "
} }
let compareArr = zip(previousNoHashTagArr, currentNoHashTagArr)
if let query = compareArr.first(where: { $0.0 != $0.1 })?.1 {
return query
}
return ""
}
}
このObservableをviewdidloadなどでsubscribeすれば、textViewに入力される度にハッシュタグを抽出できる。
私の場合、抽出されるたびにハッシュタグを検索して予測変換的な機能を実装しています。