Subjects

Youn·2021년 11월 4일
0

iOS-RxSwift

목록 보기
5/8
post-thumbnail

Subject

observable 인 동시에 observer
subject 로 전달되는 이벤트를 observer 에게 전달

Publish Subject

이벤트가 전달 되는 즉시 구독자에게 전달하는 subject
-> subject 가 최초로 생성되는 시점과 구독이 시작되는 시점 사이에 생성되는 이벤트는 사라짐
-> 이벤트가 사라지지 않게 하려면 다른 observable 사용 필요

let subject = PublishSubject<String>()  //문자열이 포함된 nextevent 를 받아서 다른 observer 에게
// subject 생성시점에는 내부에 아무 이벤트가 저장되어 있지 않음

/*1. subject 이벤트 전달 이후 구독자 생성*/
subject.onNext("hello")

let o1 = subject.subscribe( {print(">> 1", $0)})
o1.disposed(by: disposeBag)
// 출력 X
// 구독이후에 전달되는 새로운 이벤트만 구독자로 전달되기 때문에
// 구독자가 구독시작전 전달되었던 next 이벤트는 오저버로 전달 X

/*1-2. 구독자 생성 이후 전달된 이벤트*/
subject.onNext("RxSwift")
// 출력됨

/*2. 구독자 추가*/
let o2 = subject.subscribe{print(">> 2", $0)}
subject.onNext("Subject")
// o1 -> subject, RxSwift 전달
// o2 -> subject 만 전달

/*3. 완료*/
subject.onCompleted()     또는
subject.onError(MyError.error)
// o1, o2 에게 이벤트 전달

/*3-1.*/ 새로운 구독자 추가 (완료된 이후에)
let o3 = subject.subscribe{print(">> 3", $0)}
o3.disposed(by: disposeBag)
// o3 에게는 next 없이 완료이벤트만 전달

Behavior Subject

가장 최근 이벤트를 저장하고 새로운 구독자에게 전달

생성

// publish
let p = PublishSubject<Int>() // 비어있는 생성자

// behavior
let b = BehaviorSubject<Int>(value: 0) // 값 전달
  • 내부에 next 이벤트가 하나 만들어짐
  • 구독자가 생성되면 저장되어 있던 next 이벤트가 바로 전달됨
  • 새로운 next event 가 전달되면 새로운 이벤트로 교체됨
  • 가장 최근의 next event 전달
  • 최신 이벤트를 제외한 나머지 이벤트는 사라짐!

Replay Subject

지정된 수만큼 이벤트를 저장

  • 지정된 버퍼크기 만큼 최신 이벤트 저장, 새로운 구독자에게 전달
  • 버퍼 : 메모리에 저장, 메모리 사용량에 유의해야 함
let rs = ReplaySubject<Int>.create(bufferSize: 3) // 3개의 next 이벤트전달가능

(1...10).forEach{rs.onNext($0)}

rs.subscribe{print("observer 1 >> ", $0)}.disposed(by: disposeBag)
rs.onNext(11)

Async Subject

completed 이벤트가 전달되는 시점에 가장 최근 next 이벤트 1개를 구독자로 전달

  • 이벤트가 전달됐을때, 즉시 구독자로 그 이벤트를 전달하는 다른 subject 들과 달리 completed event 가 전달되기 전까지 구독자로 이벤트를 전달하지 않음
  • error 이벤트가 전달됐을 경우 next 이벤트 전달없이 error 이벤트만 전달되고 종료됨
let sub = AsyncSubject<Int>()

sub
	.subscribe{print($0)}
	.disposed(by: bag)

sub.onNext(1)
sub.onNext(2)

sub.onCompleted()

/**-출력-/
next(2)
completed

Relay

subject 를 래핑, 소스로 부터 next 이벤트를 받아서 다른 구독자로 전달

  • publish relay, behavior relay
  • next 이벤트만 전달받고 전달함
  • disposed 전까지 계속 이벤트 전달 ,종료 X
  • 주로 UI 처리에 활용
  • RxCocoa framework 에 의해 제공
  • onnext 대신 accept

publish relay

  • 빈생성자로 생성

behavior relay

  • value 로 이벤트 값 받아올 수 있음

code

import RxCocoa

let bag = DisposeBag()
let pr = PublishRelay<Int>()
let br = BehaviorRelay<Int>(value: 1)

pr.subscribe{ print("1: \($0)")}.disposed(by: bag)

pr.accept(1)
profile
youn

0개의 댓글