zzangzzangguy / TIL

IOS 관련 트러블슈팅 및 필수숙지 개념 레포
0 stars 0 forks source link

Observable 와 Observer #36

Open zzangzzangguy opened 7 months ago

zzangzzangguy commented 7 months ago

Observable의 생명주기

Observable은 세 가지 이벤트를 발생시킬 있다

.next: 새로운 값을 방출할 때 발생하는 이벤트. .completed: Observable이 성공적으로 종료되었을 때 발생하는 이벤트. .error: Observable에서 에러가 발생했을 때 발생하는 이벤트. Observable 생성하기

just: 단일 요소를 포함하는 Observable을 생성한다.

let observable = Observable.just(1)

of: 여러 요소를 포함하는 Observable을 생성한다.

let observable = Observable.of(1, 2, 3)

from: 배열로부터 Observable을 생성한다.

let observable = Observable.from([1, 2, 3])

create: 사용자 정의 Observable을 생성한다.


let observable = Observable<String>.create { observer in
    observer.onNext("A")
    observer.onNext("B")
    observer.onNext("C")
    observer.onCompleted()
    return Disposables.create()
}

Observable 구독하기

Observable에서 발생한 이벤트를 받아보려면 구독(subscribe). 구독자(Observer)는 Observable에서 발생한 이벤트를 처리.


observable.subscribe(onNext: { value in
    print(value)
}, onError: { error in
    print(error)
}, onCompleted: {
    print("Completed")
}, onDisposed: {
    print("Disposed")
})

Disposable

구독(subscription)을 취소하려면 dispose()를 호출해야 한다. 이를 간편하게 처리하기 위해 DisposeBag을 사용할 수 있음.


let disposeBag = DisposeBag()

observable.subscribe(onNext: { value in
    print(value)
})
.disposed(by: disposeBag)

연산자

Observable은 다양한 연산자를 제공하여 데이터 스트림을 변환하고 조작 가능. 예를 들어, map, filter, reduce 등의 연산자를 사용.


observable
    .map { $0 * 2 }
    .filter { $0 > 5 }
    .subscribe(onNext: { value in
        print(value)
    })
    .disposed(by: disposeBag)

Observable은 RxSwift에서 데이터 스트림을 나타내는 핵심 타입으로, 다양한 연산자를 활용하여 데이터를 변환하고 조작할 수 있음. 이를 통해 비동기 작업과 이벤트 기반 프로그래밍을 간편하게 구현할 수 있다


Observer

Observer는 Observable에서 발생한 이벤트를 받아서 처리하는 객체. Observer는 세 가지 이벤트를 처리할 수 있음:

  1. .next: Observable에서 새로운 값이 방출될 때 호출.
  2. .completed: Observable이 성공적으로 종료되었을 때 호출.
  3. .error: Observable에서 에러가 발생했을 때 호출.

Observer 생성하기

Observer를 생성하는 가장 간단한 방법은 subscribe 메서드를 사용.

observable.subscribe(onNext: { value in
    print(value)
}, onError: { error in
    print(error)
}, onCompleted: {
    print("Completed")
}, onDisposed: {
    print("Disposed")
})

위의 코드에서 onNext, onError, onCompleted, onDisposed는 클로저로 구현된 이벤트 핸들러.

AnyObserver

AnyObserver는 Observer 프로토콜을 준수하는 타입으로, Observable에서 발생한 이벤트를 처리할 수 있음.

let observer: AnyObserver<Int> = AnyObserver { event in
    switch event {
    case .next(let value):
        print(value)
    case .error(let error):
        print(error)
    case .completed:
        print("Completed")
    }
}

Binder

Binder는 RxSwift에서 제공하는 특별한 Observer. UI 바인딩에 최적화되어 있으며, 에러 이벤트를 처리하지 않는다.

let label = UILabel()
observable
    .map { "Value: \($0)" }
    .bind(to: label.rx.text)
    .disposed(by: disposeBag)

위의 코드에서 bind(to:)subscribe의 줄임 버전으로, onNext 이벤트만 처리.

사용자 정의 Observer 생성하기

사용자 정의 Observer를 생성하려면 ObserverType 프로토콜을 준수하는 타입을 구현해야 함

class MyObserver: ObserverType {
    typealias Element = Int

    func on(_ event: Event<Int>) {
        switch event {
        case .next(let value):
            print(value)
        case .error(let error):
            print(error)
        case .completed:
            print("Completed")
        }
    }
}

위의 코드에서 MyObserverInt 타입의 이벤트를 처리하는 사용자 정의 Observer.

Observer는 Observable에서 발생한 이벤트를 처리하는 객체로, RxSwift에서 데이터 스트림을 구독하고 응답하는 역할을 한다. subscribe 메서드를 사용하거나 AnyObserver, Binder 등의 타입을 활용하여 Observer를 생성할 수 있음.

zzangzzangguy commented 7 months ago

참고자료 : https://github.com/fimuxd/RxSwift/blob/master/Lectures/02_Observables/Ch2.%20Observables.md