[RxSwift][TIL] AsyncSubject

Uno·2022년 1월 22일
0

RxSwift

목록 보기
7/9

AsyncObject


  • 결론

PublishSubject + 조건(Completed 이벤트가 방출될 때만 최신 next이벤트를 방출한다)

TMI) 공식문서상 맨 위에 있는데, 이해하기 편한 순서로 글을 작성해서 AsyncObject를 제일 마지막에 작성합니다.

맨 위에 박스안에 있는 첫 번째 화살표가 Subject입니다. 빨간공 -> 녹색공 -> 파란공 순으로 이벤트가 생성되었지만, 전달되고 있진 않습니다. (두 번째 세 번째 선은 옵저버입니다.) 그리고 completed(수직방향 선)이 방출되면 파란 공(가장 최근 이벤트)를 방출 하고 바로 completed이벤트를 방출합니다. 만약 에러가 발생하게된다면, error이벤트만 방출합니다.

이러한 특성을 가진 서브젝트를 언제사용하면 좋을지 생각을 해봤습니다.

  1. 네트워킹

    네트워킹을 성공했을 때만, 이벤트를 전달하면 될 순간이 있지 않을까 생각합니다.

  2. 회원가입 시, 이메일 / 비밀번호 / 닉네임 양식에 맞게 작성했을 때만 completed 이벤트를 통해서 이벤트를 전달할 때.

    이전에 아무리 많은 이메일과 비밀번호 닉네임을 작성했더라도, 유효성검사가 된 이후에 사용자 정보만 넘기기 때문이니 그렇지 않을까 생각합니다.

위 상황들을 조금 일반화해서 생각해보면, 시점상 가장 최근 데이터만 필요하고 특정 조건을 만족했을 때만 진행되어야하는 로직이 아닐까 생각해봅니다.

이메일 양식이 맞을 때라고 상황을 가정해서 코드를 네이밍을 정하겠습니다.

먼저 서브젝트를 생성합니다.

let registerSubject = AsyncSubject<String>()

그리고 옵저버를 추가합니다.

registerSubject
	.subscribe { userInfo.email = $0 }
	.disposed(rx: bag)

이후 바로 이벤트를 전달합니다. (이 과정이 사용자가 유효한 이메일을 마구마구 입력하는 과정이 되겠습니다.)

registerSubject.onNext("moya@gmail.com")
registerSubject.onNext("momo@gmail.com")
registerSubject.onNext("yaya@gmail.com")
registerSubject.onNext("moyaKim@gmail.com")

그러다가 사용자가 완료 버튼을 누를 때, completed 이벤트를 방출하게 합니다.

@objc
func buttonDidTap(sender: UIButton) {
  if 이메일양식에맞음? {
    registerSubject.onCompleted()
  }
}

그렇게 되면 결과가 다음과 같이 출력됩니다.

next(moyaKim@gmail.com)
completed

조금 억지스러운 예시이지만, 무슨말을 전달드리려는지는 이해가 되셨길 간절히 바랍니다..ㅠ

에러가 방출되게되면, 어떤 next이벤트도 전달하지 않고 error만 전달합니다. 이러한 특성때문에 에러가 발생했을 때, 이벤트 전달을 하지 않는 것이 좋을 때, 사용하기에 좋다고 판단됩니다.

위 설명에 대한 공식문서 그림입니다.

profile
iOS & Flutter

0개의 댓글