티스토리 뷰

Subject와 Relay

Subject는 Observable이면서 Observer일 수 있습니다.

데이터를 방출하고(emit) 읽을(subscribe) 수 있습니다.

 

Relay는 RxCocoa를 import해서 씁니다.

cocoa가 붙은 것으로 알 수 있듯이 UI를 위해 만들어졌습니다.

Relay는 error와 complete가 없고 dispose할 때까지 종료되지 않습니다..

UI 이벤트를 처리하기 때문입니다.

 

PublishSubject

let disposeBag = DisposeBag()

let subject = PublishSubject<String>()

subject.onNext("1")

subject.subscribe { event in
    print(event)
}

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

subject.onCompleted()

subject.onNext("4")


//next(2)
//next(3)
//completed

PublishSubject는 subscribe한 이후 부터 발생하는 이벤트를 처리합니다.

 

BehaviorSubject

let disposeBag = DisposeBag()

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

subject.onNext("0")
subject.onNext("1")

subject.subscribe {event in
    print(event)
}

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

//next(1)
//next(2)
//next(3)

BehaviorSubject는 초기값을 가집니다.

 

ReplaySubject

let disposeBag = DisposeBag()

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

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

subject.subscribe {
    print($0)
}

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

print("Subscribe 2")
subject.subscribe{
    print($0)
}

//next(2)
//next(3)
//next(4)
//next(5)
//next(6)
//Subscribe 2
//next(5)
//next(6)

ReplaySubject는 bufferSize만큼의 이벤트를 저장하고 있을 수 있습니다.

처음 구독하기 직전 2개의 값인 2,3을 가지고 있고 구독 후에 4, 5, 6을 처리하고 다시 구독을하면 직전 값인 5, 6을 처리합니다.

 

PublishRelay

let disposeBag = DisposeBag()

let relay = PublishRelay<String>()

relay.accept("1")

relay.subscribe { event in
    print(event)
}

relay.accept("2")
relay.accept("3")

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

PulishRelay는 PublishSubject의 Wrapper 클래스입니다.

따라서 구독 이후의 이벤트를 처리합니다.

.completed나 .error 이벤트를 추가할 수 없습니다.

 

BehaviorRelay

let disposeBag = DisposeBag()

let relay = BehaviorRelay(value: "1")

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

relay.accept("2")

//next(1)
//next(2)

BehaviorRelay는 BehaviorSubject의 Wrapper 클래스입니다.

BehaviorRelay은 Variable이 Drprecated되고 새로 나왔습니다.

BehaviorRelay는 value property를 가지고 있습니다.

.accept를 이용해서 값을 변경할 수 있습니다.

.completed나 .error 이벤트를 추가할 수 없습니다.

 

기존 값을 유지하면서 새로운 값을 추가해주고 싶을 때는 다음과 같이 합니다.

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

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

relay.accept(value)

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

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

혹은

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

relay.accept(relay.value + ["2"])

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


//next(["1", "2"])
댓글
공지사항