TIL: RxSwift 기초

jeongmuyamette·2025년 1월 10일

TIL

목록 보기
24/72
post-thumbnail

RxSwift란?

RxSwift는 Reactive Extensions (ReactiveX 또는 Rx)의 Swift 구현체입니다. 비동기 프로그래밍과 이벤트 기반 프로그래밍을 위한 라이브러리입니다.

핵심 개념

1. Observable

  • 시간에 따라 발생하는 이벤트나 데이터의 흐름을 나타냄
  • 세 가지 이벤트를 방출할 수 있음:
    • next: 새로운 데이터 전달
    • completed: 성공적으로 완료
    • error: 에러 발생
let observable = Observable.just("Hello, RxSwift!")
let observable2 = Observable.from(["A", "B", "C"])

2. Observer (Subscriber)

  • Observable을 구독하여 데이터를 받는 객체
  • Observable이 방출하는 이벤트에 반응
observable.subscribe(onNext: { value in
    print(value)
}, onError: { error in
    print(error)
}, onCompleted: {
    print("Completed")
}).disposed(by: disposeBag)

3. DisposeBag

  • 메모리 관리를 위한 객체
  • 구독을 안전하게 해제하는데 사용
  • ARC(Automatic Reference Counting)와 유사한 역할
let disposeBag = DisposeBag()

4. Operators (연산자)

주요 연산자들:

  • map: 데이터 변환
  • filter: 조건에 맞는 데이터만 필터링
  • flatMap: Observable 시퀀스를 변환하고 병합
  • combineLatest: 여러 Observable의 최신 값을 결합
observable
    .map { $0.uppercased() }
    .filter { $0.count > 5 }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

실제 사용 예시

1. 텍스트필드 입력 감지

textField.rx.text
    .orEmpty
    .debounce(.milliseconds(300), scheduler: MainScheduler.instance)
    .distinctUntilChanged()
    .subscribe(onNext: { text in
        print("검색어: \(text)")
    })
    .disposed(by: disposeBag)

2. 네트워크 요청

URLSession.shared.rx.data(request: urlRequest)
    .map { try JSONDecoder().decode(Response.self, from: $0) }
    .subscribe(onNext: { response in
        print("받은 데이터: \(response)")
    }, onError: { error in
        print("에러 발생: \(error)")
    })
    .disposed(by: disposeBag)

RxSwift의 장점

  1. 비동기 코드를 선형적으로 작성 가능
  2. 복잡한 상태 관리를 단순화
  3. 선언적 프로그래밍 방식 지원
  4. 코드의 가독성과 유지보수성 향상

주의사항

  1. 메모리 누수 방지를 위해 항상 DisposeBag 사용
  2. 복잡한 연산자 체인은 가독성을 해칠 수 있음
  3. 러닝커브가 있으므로 점진적으로 학습 필요

학습 리소스

  • RxSwift GitHub 공식 문서
  • Ray Wenderlich RxSwift 튜토리얼
  • RxMarbles 웹사이트 (연산자 시각화)

0개의 댓글