본문 바로가기
iOS/Swift

RxSwift (ReactiveX)

by DnaJ 2019. 4. 26.
반응형

RxSwift (ReactiveX)

RxSwift는 RxSwift의 합성어다. 

RxReactive extension <- x는 eXtension에 X를 사용하고 있다. (왜 두번째 스펠링으로 했는지.... X가 두번째 있어서 그런가....?)

    - Reactive : 반응을 보이는

    - extension : 확대, 확장

출처 : 네이버 사전

 

구글 번역에서 Reactive extension 으로 검색하면 반응 확장이라고 나온다.

단순하게 풀어보면 이벤트(반응)의 확장이라고 표현하면 좋을것 같다.

 

https://play.google.com/store/apps/details?id=com.danchoo.tagalbum&hl=ko

 

태그앨범 - Google Play 앱

사진과 앨범을 태그로 관리하세요. 결혼식, 팬클럽, 동호회등 원하는 카테고리를 만들어 정리해보세요. 사진에 태그를 설정하여 손쉽게 찾아보세요!

play.google.com

 

 

디자인 패턴중에 Rx와 비슷하게 동작하는 것이 있다.

Observer(감시자) 패턴 이다.

Rx는 Observer 패턴에서 아이디어를 얻어 만들었다고 한다. 

Rx에서는 Observer 패턴에서 누락된 2가지 특성을 가지고 있다.

  1. 생산자가 더 이상 사용할 수있는 데이터가 없다는 것을 소비자에게 알릴 수있는 능력 (Iterable의 foreach 루프가 완료되고 그러한 경우 정상적으로 복귀 함, Observable이 옵서버의 onCompleted메소드를 호출 함 )
  2. 생산자가 소비자에게 오류가 발생했다는 신호를 보내는 기능 (반복 중에 오류가 발생하면 Iterable은 예외를 throw하고 Observable은 관찰자의 onError메서드를 호출 함 )

ReactiveX는 관찰 가능한 시퀀스를 사용하여 비동기 및 이벤트 기반 프로그램을 작성하기위한 라이브러리입니다. (출처 : ReactiveX intro)

 

http://reactivex.io/intro.html

 

ReactiveX - Intro

ReactiveX ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences. It extends the observer pattern to support sequences of data and/or events and adds operators that allow you to compose sequences together d

reactivex.io

 

 

http://reactivex.io/documentation/observable.html

 

ReactiveX - Observable

Observable In ReactiveX an observer subscribes to an Observable. Then that observer reacts to whatever item or sequence of items the Observable emits. This pattern facilitates concurrent operations because it does not need to block while waiting for the Ob

reactivex.io

 

언제 사용하면 좋을까??

필자는 회사에서 Android를 개발하고 있다.

개발하는 앱에서 간혹 발생하는 문제가 있는데 ListView와 RecyclerView를 사용하다보면 어느순간 데이터를 갱신하지 않았다고 Crash가 발생하곤 한다.

만약 Rx를 사용하여 데이터변경되었을 때 비동기적으로 ListView와 RecyclerView를 업데이트를 할수 있게되어 Crash가 발생하지 않게 될것이다. 이와 마찬가지로 iOS에서도 UITableView에서 데이터가 갱신 되었을때 UITableView가 업데이트가 되지 않는 상황이 발생하지 않을것이다.

 

데이터가 변경이 되었을경우 개발자가 놓치지 않고 변경된 사항을 알수 있을 것이다.

또한 네트워크에서 데이터를 받아왔을 경우 delegate를 생성하지 않고 여러 곳에서 변경된 데이터를 감지할 수 있다.

Rx를 사용함으로써 코드간결해지고 복잡도가 떨어지게 된다.

 

Rx는 Observer패턴으로 부터 유래가 되었기 때문에 Observer 패턴이 어떤것인지 알고 있는것이 도움이 될 것이라고 생각한다. 

 

https://smartstore.naver.com/happysiso

 

해피시소마켓 : 네이버쇼핑 스마트스토어

SISO

smartstore.naver.com

 

 

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에 간단한 예제를 작성할 것이다.

 

 

반응형

댓글