본문 바로가기

IOS

Swift - Reactive Programming (Rx)

Reactive Programming 은 반응형 프로그래밍이라고도 하며, 현재 가장핫(?) 한 기술중 하나이다.

검색하면 정말 좋은 자료들이 많지만 저도 숟가락 하나 얹어 보겠습니다.

 

그래서 Reactive Programming 이 무엇이냐?

 

  ReactiveX에서 observer는 observable 을 구독한다. observer는 observable이 방출하는 모든 아이템(들)에 대해 반응한다.

비동기 프로그래밍을 더욱 쉽게 개발 하기 위한 라이브러리이며

기존 명령형 프로그래밍이 아닌 선언형 프로그래밍으로 개발이 가능하다.

값이나 오브젝트 의 대한 내용을 구독 함으로써 값의 변화에 대응 할수가 있다.

Observable

   - 옵저버블 (Observable) 이란 데이터 스트림을 생성하는 객체를 말한다.

   - 옵저버(Observer)는 데이터 스트림을 구독하여 사용하는 객체를 를 말한다.


Just

   - 가장 기본적인 옵저버블이다.

   - 한개의 입력을 받고 그대로 방출 한다.

Observable.just("스터디")
.subscribe(onNext : {
    data in
    print("\(data)")
}).disposed(by: disposeBag)

 


From

       - 배열의 값을 받아 배열의 갯수만큼 방출하는 옵져버블

Observable.from([1,"Rxswift",2,"스터디"])
.subscribe(onNext : {
    data in
    print("\(data)")
}).disposed(by: disposeBag)

  


Zip

 

     - 2개이상의 옵져버블, 서브젝트를 받아 하나의 옵져버블로 결합해서 방출한다.

      * 결합할려는 있는 옵져버블 에 값이 들어와야 해당 내용을 방출한다.

var firstSubject = PublishSubject<String>()
var secondSubject = PublishSubject<String>()
 
Observable.zip(firstSubject, secondSubject)
.asObservable()
.subscribe(onNext : {
    first, second in
 
    print("first : \(first)")
    print("second : \(second)")
    print("-------------------")
 
}).disposed(by: disposeBag)
 
for i in 0...3
{
    firstSubject.onNext("첫번째 값 : \(i)")
}
 
for j in 0...3
{
    secondSubject.onNext("두번째 값 : \(j)")
}

 


CombineLatest

    - 2개이상의 옵져버블, 서브젝트를 받아 하나의 옵져버블로 결합해서 방출한다.

        * 짝(!?) 을 이루고있는 옵져버블에 대한 최신 값에 대해 방출한다.

var firstSubject = PublishSubject<String>()
var secondSubject = PublishSubject<String>()
 
Observable.combineLatest(firstSubject, secondSubject)
.asObservable().subscribe(onNext : {
    first, second in
    print("first : \(first)")
    print("second : \(second)")
    print("-------------------")
}).disposed(by: disposeBag)
 
for i in 0...3
{
    firstSubject.onNext("첫번째 값 : \(i)")
}
 
for j in 0...2
{
    secondSubject.onNext("두번째 값 : \(j)")
}

 


Subject

    - 옵저버블과 옵저버 역할을 두개다 수행할수 있는 타입


PublishSubject

     - subscribe 이전 데이터에 대해 전달한다.

     - 초기값은 없으며 onNext 시에 데이터를 발행 한다.

해당 ViewController 상에서 TimerViewController 에 있는 Subject를 구독 받아놓는다.

TimerViewController.textObservable
.asObserver()
.subscribe(onNext : {
    data in
    print(data)
}).disposed(by: disposeBag)

구독을 받아 놓은 상태에서 2초뒤에 해당 타이머 작동이라는 값을 발행하면 구독한 옵저버에서 받을수 있다.

static var timerObservable = PublishSubject<String>()
 
override func viewDidLoad()
{
    super.viewDidLoad()
    timer()
}
 
func timer()
{
   DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)
   {
     TimerViewController.timerObservable.onNext("타이머 작동")
   }
}

 


BehaviorSubject

     - 초기값을 가지고 있는 Subject

     - subscribe 하자마자 초기값을 방출받고 그 이후로 onNext 하는 값을 받는다

 

TimerViewController.textObservable
.asObserver()
.subscribe(onNext : {
    data in
    print(data)
}).disposed(by: disposeBag)

구독과 동시에 초기값을 발행 받고 2초뒤에 따로 발행한 값을 받는다.

static var textObservable = BehaviorSubject<String>(value: "첫번째값")
 
override func viewDidLoad()
{
    super.viewDidLoad()
    timer()
}
 
func timer()
{
   DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)
   {
     TimerViewController.textObservable.onNext("두번째값")
   }
}

 


Observable VS Subject     

Observable Subject
그냥 단지 함수이다. State 존재 X state를 가진다. data를 메모리에 저장
각각 옵저버에 대해 코드가 실행 같은 코드 실행. 모든 옵저버에 대해 오직 한번만
오직 옵저버블만 생성 옵저버블 생성 및 그것을 관찰 할수가 있음
용도 : 하나의 옵저버에 대한 간단한 Observable이 필요할때 용도 : 자주 데이터를 저장하고 수정할때
         여러개의 옵저버가 데이터를 관찰 해야할때
         옵저버와 옵저버블 사이의 연결 다리 역할

참고 : http://reactivex.io/

 

ReactiveX

CROSS-PLATFORM Available for idiomatic Java, Scala, C#, C++, Clojure, JavaScript, Python, Groovy, JRuby, and others

reactivex.io

 https://github.com/ReactiveX/RxSwift

 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

https://sujinnaljin.medium.com/rxswift-subject-99b401e5d2e5

 

[RxSwift] Subject

Observable이랑 Subject 나만 헷갈려..?

sujinnaljin.medium.com

 

'IOS' 카테고리의 다른 글

Swift - UITableView + ListClick  (0) 2021.08.13
Swift - Property Wrapper  (0) 2021.08.06
Swift - ReactorKit / ErrorHandling  (0) 2021.07.24
Swift - iOS 면접 질문 리스트  (0) 2021.07.18
Swift - UICollectionView + Paging  (0) 2021.07.13