RxSwift (ReactiveX)
RxSwift는 Rx 와 Swift의 합성어다.
Rx : Reactive extension <- x는 eXtension에 X를 사용하고 있다. (왜 두번째 스펠링으로 했는지.... X가 두번째 있어서 그런가....?)
- Reactive : 반응을 보이는
- extension : 확대, 확장
출처 : 네이버 사전
구글 번역에서 Reactive extension 으로 검색하면 반응 확장이라고 나온다.
단순하게 풀어보면 이벤트(반응)의 확장이라고 표현하면 좋을것 같다.
https://play.google.com/store/apps/details?id=com.danchoo.tagalbum&hl=ko
디자인 패턴중에 Rx와 비슷하게 동작하는 것이 있다.
Observer(감시자) 패턴 이다.
Rx는 Observer 패턴에서 아이디어를 얻어 만들었다고 한다.
Rx에서는 Observer 패턴에서 누락된 2가지 특성을 가지고 있다.
- 생산자가 더 이상 사용할 수있는 데이터가 없다는 것을 소비자에게 알릴 수있는 능력 (Iterable의 foreach 루프가 완료되고 그러한 경우 정상적으로 복귀 함, Observable이 옵서버의 onCompleted메소드를 호출 함 )
- 생산자가 소비자에게 오류가 발생했다는 신호를 보내는 기능 (반복 중에 오류가 발생하면 Iterable은 예외를 throw하고 Observable은 관찰자의 onError메서드를 호출 함 )
ReactiveX는 관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 작성하기위한 라이브러리입니다. (출처 : ReactiveX intro)
http://reactivex.io/intro.html
http://reactivex.io/documentation/observable.html
언제 사용하면 좋을까??
필자는 회사에서 Android를 개발하고 있다.
개발하는 앱에서 간혹 발생하는 문제가 있는데 ListView와 RecyclerView를 사용하다보면 어느순간 데이터를 갱신하지 않았다고 Crash가 발생하곤 한다.
만약 Rx를 사용하여 데이터가 변경되었을 때 비동기적으로 ListView와 RecyclerView를 업데이트를 할수 있게되어 Crash가 발생하지 않게 될것이다. 이와 마찬가지로 iOS에서도 UITableView에서 데이터가 갱신 되었을때 UITableView가 업데이트가 되지 않는 상황이 발생하지 않을것이다.
데이터가 변경이 되었을경우 개발자가 놓치지 않고 변경된 사항을 알수 있을 것이다.
또한 네트워크에서 데이터를 받아왔을 경우 delegate를 생성하지 않고 여러 곳에서 변경된 데이터를 감지할 수 있다.
Rx를 사용함으로써 코드가 간결해지고 복잡도가 떨어지게 된다.
Rx는 Observer패턴으로 부터 유래가 되었기 때문에 Observer 패턴이 어떤것인지 알고 있는것이 도움이 될 것이라고 생각한다.
https://smartstore.naver.com/happysiso
Observer 패턴의 이해
- Gof의 디자인 패턴에서 자세히 기제가 되어있다. (ReactiveX 소개에서도 Gof의 디자인 패턴을 언급하고 있다.)
- 1:N의 관계를 정의해 두어, 어떤 객체의 상태가 변할 때 그 객체에 의존성을 가진 다른 객체들이 그 변화를 통지받고 자동으로 갱신될 수 있게 만든다. (Gof의 디자인 패턴)
패턴을 처음 공부할 때에는 이해가 너무 안갔다... 이게 무슨말이지....???
간단한 예제를 만들었다.
protocol ObserverDelegate {
func update()
}
class ObserverPattern {
static let instance = ObserverPattern()
var subjects: [ObserverDelegate] = []
func addSubject(_ subject: ObserverDelegate) {
subjects.append(subject)
}
func update() {
for subject in subjects {
subject.update()
}
}
}
class ClassA: ObserverDelegate {
func update() {
// run update
}
}
class ClassB: ObserverDelegate {
func update() {
// run update
}
}
class CreateEventClass {
init() {
let classA = ClassA()
let classB = ClassB()
// Observer 등록
ObserverPattern.instance.addSubject(classA)
ObserverPattern.instance.addSubject(classB)
// Observer 이벤트 발생
ObserverPattern.instance.update()
}
}
예제에서는 CreateEventClass에서 옵저버를 등록 후 곧바로 update를 호출했지만, 네트워크가 끊겼을 때, 터치를 했을 때, 화면이 변경 되었을 때와 같은 특정 이벤트가 발생했을 때 update를 호출하여 상태가 변경이 된 것을 알리게 된다.
다음 블로그에는 RxSwift에 간단한 예제를 작성할 것이다.
'iOS > Swift' 카테고리의 다른 글
RxSwift 객체 구독하기 (Observable) (0) | 2019.05.18 |
---|---|
RxSwift 시작하기 (설치 & Button Tap Event - DisposeBag, rx.Tap ) (0) | 2019.05.03 |
Swift Contacts read and write (주소록 읽기, 쓰기) (0) | 2019.01.13 |
Swift Realm (2) - 조회하기 (0) | 2019.01.06 |
Swift Realm (1) (0) | 2018.12.06 |
댓글