clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅅ
  • Swift
  • Q
  • uikit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

RxSwift + MVVM

RxSwift(12). Relays

2023. 2. 17. 12:38

RxSwift는 세가지 Relays를 제공한다.

PublishRelay

서브젝트와 유사한 특징을 가지고 있고 내부에 서브젝트를 래핑하고있다.

PublishRelay는 PublishSubject를 래핑하고 있다

 

BehaviorRelay

BehaviorRelay는 BehaviorSubject를 래핑하고있다

 

ReplayRelay

ReplayRelay는 ReplayRelay를 래핑하고 있다.

 

Relay는 서브젝트와 마찬가지로 다른소스로부터 이벤트를 받아서 구독자로 전달한다.

가장 큰 차이는 NextEvent만 전달한다는것이다. CompleteEvent와 ErrorEvent는 전달 받지도 않고 전달하지도 않는다.

 

그래서 앞에서 공부한 서브젝트와 달리 종료되지 않는다.

구독자가 disposed되기 전까지 계속 이벤트를 처리한다. 그래서 주로 UIEvent처리에 활용된다.

 

Relay는 RxSwift가 아닌 Rxcocoa프레임워크를 통해 제공된다.

PublishRelay

let prelay = PublishRelay<Int>()
//빈 생성자로 생성한다는 것은 PublishSubject와 동일하다

 

let prelay = PublishRelay<Int>()
//빈 생성자로 생성한다는 것은 PublishSubject와 동일하다

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

prelay.accept(1)

//1: next(1)

Relay는 onnext메서드를 사용하지 않는다 accept메서드를 사용한다.

 

BehaviorRelay

let brelay = BehaviorRelay<Int>(value: 1)
brelay.accept(2)

brelay.subscribe{
    print("2: \($0)")
}
.disposed(by: bag)
//2: next(2)

BehaviorSubject와 마찬가지로 하나의 생성자를 갖는다.

바로 accept를 사용해 이벤트를 보내면 생성자로 전달된 이벤트가 변경된다.

let brelay = BehaviorRelay<Int>(value: 1)
brelay.accept(2)

brelay.subscribe{
    print("2: \($0)")
}
.disposed(by: bag)

brelay.accept(3)

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

바로 accept로 3을 전달하면 즉시 구독자에게 3이 전달된다.

 

BehavioRelay는 value라는 속성을 제공한다.

이속성은 릴레이가 저장하고있는 NextEvent에 접근해서 여기에 저장되어 있는 값을 return한다.

 

print(brelay.value)
//3

이 속성은 읽기 전용이고 저장되어있는 값을 바꾸진 못한다.

새로운 값으로 바꾸고 싶다면 accept메서드를 통해 새로운 NextEvent를 전달해야한다.

 

ReplayRelay

let rrelay = ReplayRelay<Int>.create(bufferSize: 3)

(1...10).forEach{
    rrelay.accept($0)
}

rrelay.subscribe{ print("3: \($0)")}

//3: next(8)
//3: next(9)
//3: next(10)

ReplaySubject와 마찬가지로 create메서드를 통해 생성하고 버퍼의 사이즈를 전달한다.

 

저작자표시 비영리 동일조건 (새창열림)
    'RxSwift + MVVM' 카테고리의 다른 글
    • RxSwift(14). elementAt
    • RxSwift(13). ignoreElements
    • RxSwift(11). AsyncSubject
    • RxSwift(10). ReplaySubject
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바