RxSwift의 핵심 Observable

DEVJUN·2024년 2월 21일
0

RxSwift

목록 보기
2/9
post-thumbnail

1. Observable

RxSwift 코드를 조금이라도 본 경험이 있다면 Observable은 한번쯤은 봤을 것이다.Observable은 RxSwift의 핵심이다.

그럼 이놈은 대체 어떤 역할을 하느냐??🤔

Observable은 이벤트를 전달한다. Observer는 Observable을 감시(구독)한다.

Observable은 3가지 이벤트를 전달한다. 이벤트에 값이 포함되어 있다면 Next이벤트를 통해 전달한다. 이를 방출(Emission)이라 한다. 하지만 Observable은 Observer와 달리 다른 Observable을 구독하지 못한다. 또한 Observer는 다른 Observer로 이벤트를 전달하지 못한다.

Observable에서 에러가 발생하면 Error 이벤트가 전달되고 정상적으로 종료되면 Completed 이벤트가 전달된다.

이게 Observable의 기본이다!!

그렇다면 Observable은 어떻게 만들까? 아래에 코드를 보자! 다음 파트에서 소개하겠지만 Observable뒤에 create() ?? , from() ?? 이런 메서드들이 적혀있다. 이는 연산자라고 한다.

// create 연산자를 통해 Observable의 동작을 직접 구현
Observable<Int>.create { (observer) -> Disposable in
    observer.on(.next(0))
    observer.onNext(1) // on(.next())와 같음!
    observer.onCompleted()
    
    return Disposables.create()
}

// from 연산자를 통해 위 create 코드와 똑같은 동작
Observable.from([0,1])

2. 구독(Subscrbie)

자 이렇게 Observable을 만들어 보았다! 그렇다면 저 Observable.create() 내의 클로저와 Observable.from()에서 이벤트가 전달되는 시점은 언제일까??

바로 Observer가 Observable을 구독하는 시점이다.
구독을 하는 방법은 Subscribe()를 호출하는 것이다.

let bag = DisposeBag()

// create 연산자를 통해 Observable의 동작을 직접 구현
let o1 = Observable<Int>.create { (observer) -> Disposable in
    observer.on(.next(0))
    observer.onNext(1) // on(.next())와 같음!
    observer.onCompleted()
    
    return Disposables.create()
}

// 구독1
o1.subscribe {
	print("== Start ==")
	print($0) // 형식이 옵셔널임
    
    if let elem = $0.element {
    	print(elem)
    }
    print("== End =")
}

// 결과 
== Start ==
next(0)
0
== End ==
== Start ==
next(1)
1
== End ==
== Start ==
completed
== End ==


// 구독2 (onNext는 개별 이벤트를 별도의 클로저에서 처리할 때 사용)
o1.subscribe(onNext: {
	print($0)
})

// 결과 
0
1


Observable.from([0,1])
	subscribe(onNext: {
    	print($0)
    })
    .disposed(by: bag)


또한 Observable에서 중요한 규칙은 Observer는 동시에 두개 이상의 이벤트를 처리하지 않는다.즉 Observable은 여러 이벤트를 동시에 전달하지 않는다❗️
print로 찍힌 start와 end를 보면 확인할 수 있다. 하나의 이벤트가 처리된 다음 그 다음 이벤트가 처리되고 있다.

3. Disposables(리소스 정리 -> 메모리 관리)

그렇다면 이벤트를 구독까지 하고 만약 Observable에 대한 이벤트를 받고 싶지 않아서.."구독을 해제"하고 싶을 땐 어떻게 하나!? Disposable을 통해 해제할 수 있다.

  • Observable은 onError()나 onCompleted()로 끝나면 굳이 리소스 정리를 할 필요는 없다. 하지만 RxSwift 공식문서에서는 그래도 리소스 정리 코드를 넣을 것을 강조한다. 아래 코드를 보자
let subscription1 = Observable.from([1, 2, 3])
    .subscribe(onNext: { elem in
        print("Next", elem)
    }, onError: { error in
        print("Error", error)
    }, onCompleted: {
        print("Completed")
    }, onDisposed: { // Observable이 전달하는 이벤트는 아님, Observable과 관련된 모든 리소스가 제거된 이후에 호출됨
        print("Disposed")
    })

subscription1.dispose() // 리소스 해제


var bag = DisposeBag()

Observable.from([1, 2, 3])
    .subscribe {
        print($0)
    }
    .disposed(by: bag)
	

subscription1은 dispose() 메소드를 통해 리소스가 정리되고 있다. 하지만 공식 문서에서는 dispose()보단 아래 from() 연산자 쪽에 있는 DisposeBag()을 사용할 것을 강조한다.

DisposeBag은 dispose()와 같은 메소드를 제공하지 않는다. 다만 새로운 DisposeBag()을 만들면 이전에 있던 DisposeBag()은 해제된다.



KXCoding 강의
Marble Diagram
ReactiveX 사이트

profile
🧑🏻‍💻iOS

0개의 댓글