[iOS 4주차] RxSwift

황석범·2024년 11월 16일
0

내일배움캠프_iOS_5기

목록 보기
24/76

RxSwift에 대한 강의를 4주차 주말인 오늘에서야 보면서 정리해본다...
RxSwift라는 단어가 계속 보여서 강의 내용 맨 마지막에 있던 게 기억나서 찾아봤다....


RxSwift

  • RxSwift는 Reactive Programming 패러다임을 기반으로 한 Swift용 라이브러리로, 비동기적 데이터 흐름을 처리하고, 이벤트 기반 프로그래밍을 효율적으로 구현할 수 있도록 돕습니다. RxSwift는 관찰 가능한 데이터 스트림(Observable)과 이를 구독하여 반응하는 옵저버(Observer)를 중심으로 동작하며, 애플리케이션의 상태와 이벤트를 선언적이고 직관적으로 관리할 수 있게 해줍니다.

1. Ovservable(옵저버블)

  • 데이터를 비동기적으로 생성하고 전달하는 스트림입니다
  • 옵저버블은 데이터를 발행(emit)하고, 이를 구독(subscribe)하는 옵저버와 연결됩니다.

방출하는 이벤트의 종류

  • onNext: 아이템(새로운 데이터)방출
  • onCompledted: complete 되었을 때 방출(데이터 스트림이 정상적으로 종료되었음을 알림)
  • onError: 에러 발생했을 때 방출
  • onDisposed: 옵저버가 처분되었을 때 방출
import RxSwift

let observable = Observable.of("Hello", "RxSwift")
observable.subscribe { event in
    print(event)
}
next(Hello)
next(RxSwift)
completed

Hot Observable VS Cold Observable

  1. Hot Observable
  • 옵저버가 옵저버블을 구독한 순간부터 default 이벤트를 방출해줍니다.
  • ex)
    • 슬랙에 채널에 초대받아서 들어와봤다고 가정해볼게요!
    • 앞에서 사람들이 작성한 채팅을 볼 수 있죠!?
    • 이렇게 처음 구독(입장)했을 때 값을 받을 수 있는 것을 핫 옵저버블 이라고 합니다.
  1. Cold Oservable
  • 구독한 순간 default 이벤트가 없고 구독하고 나서 이벤트가 방출하면 그때 이벤트를 받을 수 있습니다.
  • ex)
    • 오픈 카톡방에 들어갔다고 생각해보죠.
    • 처음에 들어갔는데 전에 있던 대화를 볼 수 없습니다.
    • 들어온 이후에 주고받은 대화만 볼 수 있습니다.
    • 이렇게 처음에 구독(입장)한 후에 방출된 이벤트를 처리하는 것을 콜드옵저버블이라고 합니다.

2. Observer(옵저버)

  • Observable이 발생하는 이벤트를 받아서 처리하는 객체입니다.
  • subscribe 메서드를 통해 Observable과 연결됩니다.
let observable = Observable.of(1, 2, 3)
observable.subscribe(onNext: { value in
    print("Received value: \(value)")
})
Received value: 1
Received value: 2
Received value: 3

3. Subject

  • Observable과 Observer의 역할을 동시에 수행할 수 있는 객체입니다.
  • 수동으로 데이터를 발행하거나, Observable로부터 데이터를 받을 수 있습니다.

주요 Subject 종류

  • PublishSubject: 구독 이후에 발행된 항목만 옵저버에게 전달.
  • BehaviorSubject: 최신 항목 하나를 저장하고 새로운 옵저버에게 제공.
  • ReplaySubject: 모든 발행된 항목을 저장하고 새로운 옵저버에게 제공.
  • AsyncSubject: 스트림이 완료된 후 마지막 항목만 전달.
    public func subscribe(
    		onNext: ((Element) -> Void)? = nil,
          onError: ((Swift.Error) -> Void)? = nil,
          onCompleted: (() -> Void)? = nil,
          onDisposed: (() -> Void)? = nil
          )-> Disposable{
          }
    하나씩 구독을 취소하는 방법
    let dispose = Observable<Int>
    		.interval(,seconds(1), scheduler: MainScheduler.asyncInstance)
         .subscribe{ value in 
         	print("onNext:\(value)")
         } onError: { error in 
         	print(error)
         } onCompleted: {
         	print("Completed")
         } onDisposed: {
         	print("Disposed")
         }
         
     DispatchQueue.main.asyncAfter(deadline: .now() + 10) 	{
     	dispose.dispose()
    }
    한번에 여러 개를 구독 취소하는 방법
    • DisposeBag()이라는 걸 사용해서 가방에 담아서 관리

      var disposeBag = DisposeBag()
      Observable<Int>
      		.interval(,seconds(1), scheduler: MainScheduler.asyncInstance)
           .subscribe{ value in 
           	print("onNext:\(value)")
           } onError: { error in 
           	print(error)
           } onCompleted: {
           	print("Completed")
           } onDisposed: {
           	print("Disposed")
           }
           
       DispatchQueue.main.asyncAfter(deadline: .now() + 10) 	{
       	dispose.dispose()
      }
      
let subject = PublishSubject<String>()
subject.onNext("Hello") // 이 값은 구독 전에 발행되어 전달되지 않음

subject.subscribe(onNext: { value in
    print("Subscriber received: \(value)")
})

subject.onNext("RxSwift")
subject.onCompleted()
Subscriber received: RxSwift

4. Schedulers

  • 작업 실행의 쓰레드를 제어합니다.
  • 주요 Schedulaer:
    • MainScheduler: 메인 쓰레드에서 실행
    • ConcurrentScheduler: 병렬로 실행
    • SerialDispatchQueueScheduler: 지정된 DispatchQueue에서 작업 실행
    • ImmediateScheduler: 즉시 작업 실행
Observable.of(1, 2, 3)
    .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { value in
        print("Received on main thread: \(value)")
    })

5. Operators

  • RxSwift는 데이터를 변환, 필터링, 결합, 병합하는 다양한 연산자(Operators)를 제공합니다.

대표적인 연산자

  • map: 데이터를 변환
  • filter: 특정 조건에 따라 데이터를 필터링
  • flatMap: 비동기적으로 데이터를 변환
  • merge: 여러 스트림을 하나로 병합
  • combineLatest: 여러 스트림의 최신 값을 결합

Observable.of(1, 2, 3, 4)
    .filter { $0 % 2 == 0 }
    .map { $0 * 10 }
    .subscribe(onNext: { value in
        print("Processed value: \(value)")
    })

Processed value: 20
Processed value: 40

RxSwift의 사용 사례

  1. UI 이벤트 처리:
  • 버튼 클릭, 텍스트 입력 등 UI 이벤트를 Rx 기반으로 처리.
  1. 비동기 네트워크 요청:
  • API 요청 결과를 옵저버블로 처리.
  1. 데이터 바인딩:
  • ViewModel과 View 간의 데이터 동기화에 활용.
  1. 상태 관리:
  • 여러 비동기 작업의 상태를 조율.

RxSwift와 관련된 라이브러리

  1. RxCocoa: UIKit 및 AppKit과 RxSwift를 통합
  • 버튼 클릭, 텍스트 필드 입력 등을 쉽게 다룰 수 있음
let disposeBag = DisposeBag()
myButton.rx.tap
    .subscribe(onNext: {
        print("Button tapped!")
    })
    .disposed(by: disposeBag)
  1. RxRelay: 상태를 저장하고 지속적인 데이터 스트림 제공(BehaviorRelay, PublishRelay 등)

장단점

장점

  • 비동기 코드의 선언적 처리 가능
  • 코드 가독성 증가 및 유지보수 용이
  • 강력한 연산자 제공으로 복잡한 데이터 흐름 처리

단점

  • 러닝 커브가 다소 높음
  • 간단한 프로젝트에서는 과도한 사용일 수 있음
  • 메모리 관리(DisposeBag 등)에 대한 추가 학습 필요

RxSwift는 Swift에서 비동기 프로그래밍을 효율적이고 선언적으로 처리하기 위한 강력한 도구입니다. 특히 MVVM 아키텍처를 구현할 때 유용하므로, 이를 프로젝트에 적절히 활용하면 생산성과 코드 품질을 크게 향상시킬 수 있습니다.

머리아프다 다음에 사용하면서 다시 공부하자...

profile
iOS 공부중...

0개의 댓글

관련 채용 정보