[RxSwift] 주요 개념

팔랑이·2024년 8월 1일

iOS/Swift

목록 보기
55/90
post-thumbnail

RxSwift

RxSwift는 반응형 프로그래밍을 iOS에서 구현할 수 있게 도와주는 라이브러리로, 주로 Observable, Single, Subject 같은 개념들을 사용해서 비동기 작업을 쉽게 처리할 수 있다.


1. Observable

Observable은 데이터를 스트림 형태로 방출하는 역할을 한다.
여기서는 문자열 데이터를 순차적으로 방출하는 예제를 작성

func test() {
    let nameObservable: Observable<String> = Observable.create { observer in
        observer.onNext("SH")
        observer.onNext("Palrang")
        observer.onNext("Kim")
        return Disposables.create()
    }

    nameObservable.subscribe(onNext: { value in
        print("이름: \(value)")
    }, onCompleted: {
        print("끝")
    }).disposed(by: disposeBag)

    print("하이")
}
  • onNext: 정상적인 데이터를 방출할 때 사용
  • 구독(subscribe)을 해야 실제로 데이터 방출이 이루어짐.
  • 코드의 마지막 print("하이")는 동기적으로 실행되기 때문에 옵저버블보다 나중에 찍히는 걸 확인할 수 있음.

2. Observable의 비동기 방출

이번엔 1초마다 정수형 데이터를 방출하는 Observable로, 비동기적으로 데이터를 방출하기 때문에 순서가 달라진다.

func test2() {
    let someObservable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance).take(5)

    someObservable.subscribe(onNext: { value in
        print("방출된 값: \(value)")
    }, onCompleted: {
        print("completed")
    }).disposed(by: disposeBag)

    print("헬로")
}
  • 여기서는 interval을 사용해서 1초마다 값을 방출함.
  • 비동기적으로 동작하기 때문에 print("헬로")가 먼저 실행되고, 그 다음에 값이 방출되는 걸 볼 수 있음.

3. Single

Single은 한 번만 데이터를 방출하거나 에러를 발생시키는 Observable로,주로 네트워크 요청 같은 작업에 사용된다.

func test3() {
    let single = Single.create { observer in
        observer(.success("Palrang"))
        return Disposables.create()
    }

    single.subscribe(onSuccess: { value in
        print(value)
    }).disposed(by: disposeBag)
}
  • 여기서 onSuccess는 성공적으로 데이터를 방출할 때 사용되며, 옵저버블의 onNext와 동일
  • SingleonFailure는 옵저버블의 onError와 동일

4. Subject - BehaviorSubject

Subject는 옵저버블 중에서 외부에서 값을 넣어줄 수 있는 옵저버블이다.

BehaviorSubject는 초기값을 가지는 Subject로, 가장 최근에 방출된 값을 기억하고 있다가 새로운 구독자에게 그 값을 방출해준다.

func test4() {
    let subject = BehaviorSubject(value: 10)

    subject.subscribe(onNext: { value in
        print("값 방출: \(value)")
    }).disposed(by: disposeBag)

    subject.onNext(20)
    subject.onNext(30)
}
  • 초기값을 설정할 수 있어서 제네릭 타입을 명시하지 않아도 된다
  • onNext로 외부에서도 값을 주입할 수 있음.

5. Subject - PublishSubject

PublishSubject는 초기값이 없고,구독 이후에 방출된 데이터만 받을 수 있다.

func test5() {
    let subject = PublishSubject<Int>()

    subject.subscribe(onNext: { value in
        print("값 방출: \(value)")
    }).disposed(by: disposeBag)

    subject.onNext(20)
    subject.onNext(30)
}
  • 구독한 이후에만 데이터를 방출
profile
정체되지 않는 성장

0개의 댓글