RxSwift 2

황석범·2024년 12월 27일
0

내일배움캠프_iOS_5기

목록 보기
53/76

https://velog.io/@tjrqja07/posts?tag=rxswift

이전에 강의 보면서 정리해논 내용에 이번에 새로 강의를 들으면서 추가적인 정리를 해보자...

1. Observable과 Observer

  • Observable: 데이터를 방출하는 스트림.
    • 데이터가 변하거나 이벤트가 발생하면 구독자(Observer)에게 알림.
    • Observable은 onNext, onError, onCompleted 이벤트를 방출.
  • Observer: Observable을 구독하고, 방출된 데이터를 받아 처리하는 역할.
    • onNext: 데이터 수신.
    • onError: 에러 수신.
    • onCompleted: 스트림이 완료되었음을 알림.
  • Subscribe: Subscribe는 Observable과 Observer를 연결하는 과정.
  • DisposeBag: DisposeBag은 구독의 수명을 자동으로 관리하는 도구
    • Observable 구독을 수동으로 해제하지 않아도 DisposeBag을 사용하면 객체의 deinit 시점에 자동으로 해제됩니다.

Observable 생성 방법

1. Observable.create(): Observable을 생성하는 가장 기본적인 방법

import Foundation
import RxSwift

// 예시 에러 선언.
struct MyError: Error {}

// 구독 해제를 위한 DisposeBag 선언.
// 구독을 하고 나선 구독 해제를 반드시 해줘야 합니다.
let disposeBag = DisposeBag()

// observable 생성.
// create 클로저 안에 방출할 데이터를 선언합니다.
let observable = Observable<String>.create { observer in
    // 정상적인 데이터 방출.
    observer.onNext("Apple")
    observer.onNext("Banana")
    observer.onNext("Cake")
    
    // 에러 방출. 에러가 방출되면 스트림이 종료됩니다.
    observer.onError(MyError())
    
    // Disposables.create 를 리턴해줌으로써 Observable 생성 완료.
    return Disposables.create()
}

// 구독 (subscribe).
// 각 상태에 따라서 스트림이 흘렀을 때 어떤 행동을 취할 것인지 정의합니다.

observable.subscribe(onNext: { data in
    print("onNext: \(data)")
}, onError: { error in
    print("onError: \(error)")
}, onCompleted: {
    print("onCompleted")
}, onDisposed: {
    print("onDisposed")
}).disposed(by: disposeBag)

2. Observable.just(): 간단하게 단일 데이터를 방출하는 Observable을 생성할 때

// 단일 데이터를 방출하는 just 활용.
let observable2 = Observable.just("Adam")

// 간단하게 onNext 만 선언할 수도 있습니다.
observable2.subscribe(onNext: { data in
    print("onNext: \(data)")
}).disposed(by: disposeBag)

3. Observable.of(): 여러 개의 데이터를 방출하는 Observable을 생성할 때

// 복수 데이터를 방출하는 of 활용.
let observable3 = Observable.of("red", "blue", "yellow")

observable3.subscribe(onNext: { data in
    print("onNext: \(data)")
}).disposed(by: disposeBag)

4. Observable.from(): 배열에서 각 요소를 순차적으로 방출하는 Observable을 생성할 때

// 배열로 부터 데이터를 방출하는 from 활용.
let observable4 = Observable.from([1, 2, 3, 4, 5])

observable4.subscribe(onNext: { data in
    print("onNext: \(data)")
}).disposed(by: disposeBag)

5. Observable.interval(): 일정한 시간 주기로 데이터를 방출하는 Observable을 생성할 때

// Scheduler 는 쓰레드 지정을 의미. Xcode Command Line Tools 에서는 
// Main Thread 의 개념이 없기 때문에 임의의 Scheduler 생성.
let scheduler = SerialDispatchQueueScheduler(qos: .default)

// 1초마다 증가하는 Int 값을 방출하는 Observable 생성.
// take(5) 는 Observable 에서 방출하는 데이터 중 처음 5개까지만 받겠다는 operator.
let observable5 = Observable<Int>.interval(.seconds(1), scheduler: scheduler)
    .take(5) 

observable5.subscribe { event in
    print(event)
}.disposed(by: disposeBag)

// input 이 들어오기 전까지 Xcode Command Line Tools 가 종료되지 않도록 하기위해 선언.
let input = readLine()

Trait

  • Trait은 Observable 중에서도 특별한 상황에 맞게 제공되는 Observable을 말함

1. Single

  • 오직 하나의 값만을 방출하는 Observable
    • onSuccess : Observable 의 onNext 와 같은 개념.
    • onFailure : Observable 의 onError 와 같은 개념.
    • onCompleted 는 존재하지 않습니다.
      하나의 값을 방출하거나, 에러를 방출하면 곧바로 스트림이 종료됩니다.

2. Mabye

  • 하나의 값을 뱉거나, 값을 뱉지 않고 그냥 complete 되거나, 에러를 방출하는 Observable 을 Maybe 라고 합니다. “아마도 값이 있을 수도 있고 없을 수도 있어요” 로 이해하시면 됩니다.
    • onSuccess : Observable 의 onNext 와 같은 개념.
    • onError : Observable 의 onError 와 같은 개념.
    • onCompleted: Observable 의 onCompleted 와 같은 개념.
      하나의 값을 방출하거나, 에러를 방출하면 곧바로 스트림이 종료됩니다.
      값을 방출하지 않고 그냥 complete 될 수도 있습니다.

3. Completable

  • 값을 뱉지 않고 무언가 완료되는 시점만 알고싶을때는 Completable 을 사용합니다.
    • onCompleted: Observable 의 onCompleted 와 같은 개념.
    • onError : Observable 의 onError 와 같은 개념.
      유의미한 값이 필요없고, 무언가 로딩이 되었다가 완료되었다. 이런 완료 시점을 알고싶을 때 활용할 수 있습니다.

2. Subjects

  • Observable과 Observer의 역할을 동시에 수행.

  • 외부에서 이벤트를 추가하고, 내부적으로 구독자들에게 이벤트를 전달.

  • 주요 종류:

    • PublishSubject: 초기값 없이 구독 이후의 이벤트만 전달.
    • BehaviorSubject: 초기값을 가지고 있으며, 가장 최근의 이벤트를 유지.
    • ReplaySubject: 지정된 버퍼 크기만큼 이전 이벤트를 저장하고 새로운 구독자에게 전달.
    • AsyncSubject: 스트림 완료 시 마지막 이벤트만 전달.

3. Relay

  • RelaySubject와 비슷하게 Observable의 역할과 Observer의 역할을 수행.

  • 하지만 에러나 완료 이벤트를 방출하지 않도록 설계된 RxCocoa의 객체

  • 에러나 완료가 되지 않기 때문에 주로 UI 이벤트 처리에서 사용(UI를 그리는 작업은 멈추면 안되기 때문), 애플리케이션 상태 관리에 유용

  • 주요 종류:

    • BehaviorRelay: BehaviorSubject와 동작 논리는 같음
      초깃값을 가지며, 구독을 시작하면 가장 최근에 방출되었던 값을 받으며 구독을 시작
    • PublishRelay: PublishSubject와 동작 논리가 같음
      초깃값을 가지지 않으며, 구독을 시작했어도 가장 최근에 방출된 값을 받지 않습니다.
      구독 이후로 흐른 값만 받아옴

4. Schedulers

  • RxSwift에서 작업을 실행할 스레드를 지정.
  • 주요 종류:
    • MainScheduler: 메인 스레드(UI 작업).
    • ConcurrentDispatchQueueScheduler: 비동기 작업(백그라운드).
    • OperationQueueScheduler: OperationQueue에서 작업 실행.

5. Operators

  • Observable의 데이터를 변환하거나 필터링하는 데 사용.

  • Transform:

    • map: 각 요소를 변환.
    • flatMap: Observable을 변환하여 스트림을 병합.
    • scan: 값을 누적.
  • Filter:

    • filter: 특정 조건을 만족하는 요소만 방출.
    • take: 지정된 개수의 요소만 방출.
    • debounce: 지정된 시간 동안 데이터가 방출되지 않을 때만 전달.
  • Combine:

    • merge: 여러 스트림을 하나로 병합.
    • zip: 여러 스트림의 요소를 조합.
    • combineLatest: 가장 최신 데이터를 조합.

6. RxCocoa

  • RxCocoa는 RxSwift의 확장 라이브러리로, 주로 UIKit 및 AppKit과 같은 애플의 UI 프레임워크를 Reactive 방식으로 활용할 수 있도록 도와줍니다.

주요 특징:

  • UIKit과의 연동:

    • UIButton, UILabel, UITextField 등 다양한 UIKit 요소들을 Observable로 변환하여 이벤트를 처리할 수 있습니다.
      예: 버튼 탭 이벤트, 텍스트 필드 입력 감지.
  • Binding 지원:

    • RxCocoa는 UI 요소와 데이터 스트림 간의 바인딩을 쉽게 만들어줍니다.
      예를 들어, ViewModel 데이터를 UILabel이나 UITextField에 쉽게 바인딩 가능.
  • Driver:

    • UI 업데이트를 안전하고 쉽게 할 수 있는 Driver라는 특별한 Observable 유형을 제공합니다.
      특징: Main Thread에서 동작, 에러를 방출하지 않음, 공유 상태.
import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    let disposeBag = DisposeBag()
    let textField = UITextField()
    let label = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()

        // 텍스트 필드 입력 값을 라벨에 바인딩
        textField.rx.text.orEmpty
            .bind(to: label.rx.text)
            .disposed(by: disposeBag)
    }
}
profile
iOS 공부중...

0개의 댓글

관련 채용 정보