[iOS] RxSwift - Subjects

PM077·2022년 12월 27일
0

iOS

목록 보기
9/21

PublishSubject

  • 그냥 Subject 만드는 것.
  • PublishSubject 뒤에 <>안에 타입을 정해줘야한다
import UIKit
import RxSwift

let disposeBag = DisposeBag()

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)
// completed

BehaviorSubject

  • subscribe전 마지막 value를 출력함
  • 밑에 코드 경우 Last Issue가 마지막 값이니 그걸 출력하고 PublishSubject와 동일하게 작동
import UIKit
import RxSwift

let disposeBag = DisposeBag()

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

subject.onNext("Last Issue")

subject.subscribe { event in
    print(event)
}

subject.onNext("Issue 1")

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

ReplaySubject

  • subscribe 시점에서 마지막 두 개 부터 시작해서 출력함(buffersize에 따라 변동)
  • 첫 subject.subscribe는 Issue2,3,4,5,6을 출력 할 것임(1,2,3 중 2,3이 마지막 두 개 이니)
  • 이 후 두 번째 subject.subscribe는 5,6을 출력함
import UIKit
import RxSwift

let disposeBag = DisposeBag()

let subject = ReplaySubject<String>.create(bufferSize: 2)

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

subject.subscribe {
    print($0)
}

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

print("[Subscription 2]")
subject.subscribe {
    print($0)
}

//next(Issue 2)
//next(Issue 3)
//next(Issue 4)
//next(Issue 5)
//next(Issue 6)
//[Subscription 2]
//next(Issue 5)
//next(Issue 6)

Variable

  • variable을 통해 처음에 지정한 value 값을 넣어줄 수 있음.
  • 즉, variable에는 item 1,2가 출력이 될 것
  • Variable을 사용하면 BehaviorRelay를 추천하기는 함(아래 설명)
import UIKit
import RxSwift

let disposeBag = DisposeBag()

let variable = Variable([String]())

variable.value.append("Item 1")

variable.asObservable()
    .subscribe {
        print($0)
}

variable.value.append("Item 2")

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

BehaviorRelay

  • Variable과 비슷하나 RxCocoa를 import해서 사용함
  • 위의 variable을 사용하면 Depreciated가 나온다. 이는 추후에 없어질 수 있기 때문이다(Variable이)
  • 주석과 같이 accept(relay.value~~~)를 할 수 있지만 이는 코딩이 어려우니 value에 append를 한 후 마지막에 accept로 넣어주는 방법이 있다
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.accept(relay.value + ["Item 2"])

relay.asObservable()
    .subscribe {
        print($0)
}

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

0개의 댓글