iOS/RxSwift

iOS(RxSwift) Subject 종류와 예시 코드

crazydeer 2022. 8. 31. 08:00
반응형

Observable이라는 신문을 구독하고 있는 구독자(Subscriber)이 있다고 생각한다.

Subject는 Observable에 흐르는 event를 받아 구독자에게 전달한다고 보면 된다.

 

종류

  1. Publish Subject
  2. Behavior Subject
  3. Replay Subject
  4. Variable
  5. BehaviorRelay

 

PublishSubject

let subject = PublishSubject<String>()

subject.onNext("Issue 1")

subject.subscribe { event in
    print(event)
}

subject.onNext("Issue 2")
subject.onNext("Issue 3")

subject.dispose()
//subject.onCompleted()

subject.onNext("Issue 4")

//next(Issue 2)
//next(Issue 3)

subject를 구독하고 난 뒤에 onNext만 흘러들어오며

dispose(즉, 구독취소)하고 난 뒤에 onNext는 당연히 넘어오지 않는다.

dispose가 아니고 onCompleted()를 해줘도 마찬가지로 Issue 4는 넘어오지 않는다.

 

BehaviorSubject

let subject = BehaviorSubject(value: "Initial Value")

subject.onNext("Last Issue 1")
subject.onNext("Last Issue 2")

subject.subscribe { event in
    print(event)
}

subject.onNext("Issue 1")

//next(Last Issue 2)
//next(Issue 1)

데이터를 갖고 있다가 (초기화할 때 받았던 데이터 든, 그 이후에 onNext로 받은 데이터 든)

마지막에 갖고 있는 데이터(마블) 하나를 구독하는 순간 흘려 보내준다.

 

💡
초기화할 때 꼭 변수를 할당해줘야 한다.

 

ReplaySubject

// need to have bufferSize
let subject = ReplaySubject<String>.create(bufferSize: 2)

subject.onNext("Issue 1")
subject.onNext("Issue 2")
subject.onNext("Issue 3")

print("--- 1st Subscription ---")
subject.subscribe { val in
    print(val)
}

subject.onNext("Issue 4")
subject.onNext("Issue 5")
subject.onNext("Issue 6")

print("\n--- 2nd Subscription ---")
subject.subscribe { val in
    print(val)
}

print("\n--- After 2nd Subscribing, onNext event ---")
subject.onNext("Issue 7")
subject.onNext("Issue 8")


//--- 1st Subscription ---
//next(Issue 2)
//next(Issue 3)
//next(Issue 4)
//next(Issue 5)
//next(Issue 6)
//
//--- 2nd Subscription ---
//next(Issue 5)
//next(Issue 6)
//
//--- After 2nd Subscribing, onNext event ---
//next(Issue 7)
//next(Issue 7)
//next(Issue 8)
//next(Issue 8)

bufferSize가 2인 경우 마지막 2개의 데이터(마블)을 받아온다.

첫번째 구독하는 순간 이슈 2이슈 3을 받아왔고 이후에 onNext로 데이터가 계속 넘어오다가

새로운 두번째 구독하는 순간 이슈 5이슈 6를 흘려보낸다.

두번째 구독 이후에 onNext 이벤트는 구독자가 둘이니까 2개 씩 print된다.

 

Variables

let variable = Variable([String]())

variable.value.append("Item 1")

variable.asObservable()
    .subscribe { val in
        print(val)
    }

variable.value.append("Item 2")

//ℹ️ [DEPRECATED] `Variable` is planned for future deprecation. Please consider `BehaviorRelay` as a replacement. Read more at: https://git.io/vNqvx
//next(["Item 1"])
//next(["Item 1", "Item 2"])

VariableBehaviorRelay로 대체되었다.

 

BehaviorRelay

💡
BehaviorRelay는 RxCocoa를 설치해야 한다.

 

 

import UIKit
import RxSwift
import RxCocoa

let disposeBag = DisposeBag()

let relay = BehaviorRelay(value: ["Item 1"])

var value = relay.value
value.append("Item 2")
value.append("Item 3")

relay.accept(value)

relay.asObservable()
    .subscribe { val in
        print(val)
    }

//next(["Item 1", "Item 2", "Item 3"])

코드로 형태와 특징을 이해해본다.

 

 

Reference

 

Mastering RxSwift for iOS Reactive Programming for Developers

Reactive Programming Using Swift Programming Language

www.udemy.com

 

반응형