[RxSwift] 가장 기본적이고 중요한 Observable에 대해서 알아보자

이전에 RxSwift에 대한 개념을 한번 정리했으니 이제 중요한 개념을 자세하게 한번 알아보자

 

RxSwift의 핵심 개념 중 하나는 바로 Observable이다.

 

Observable은 데이터를 비동기적으로 처리할 수 있는 데이터 스트림을 나타내며, 시간의 흐름에 따라 데이터를 방출한다.

 

이 데이터를 관찰하는 객체는 Observer라고 한다. Observable을 관찰하는 객채는 Observer! 기억하기

Observable의 생명주기는 세가지 이벤트로 나눠 진다.

 

바로바로

  • onNext : 새로운 데이터가 발행될 때 호출되고 여러번 호출 될 수 있다.
  • onError : 에러가 발생하면 호출되고 이 이벤트가 호출되면 스트림이 종료된다!
  • onCompleted : 데이터 스트림이 정상적으로 완료되었을 때 호출되고 이 이벤트가 호출되면 스트림이 종료된다.

간단한 예제를 통해 더 자세하게 알아보자!

enum Event<Element> {
    case next(Element)
    case error(Swift.Error)
    case completed
}

먼저 Observable 를 생성해주자 다양한 방법으로 생성할 수 있는데 가장 기본적으로 사용하는 방식은 바로 Observable.create 메서드를 사용하는 것!

import RxSwift

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

이 예제에서는 Hello와 World라는 두개의 문자열이 Observable을 통해 발행되고, 그 후에 스트림이 완료된다. Disposables.create는 구독이 해제될 때 실행되는 정리 작업을 정의한다.

 

그 다음 Observable 구독하기를 알아보자 Observable을 사용하기 위해서는 위에서 말했던 것 처럼 Observer가 필요하다. Observer는 Observable의 발행물을 구독(Subscribe)하고 onNext, onError, onCompleted 이벤트를 처리한다.

let subscription = observable.subscribe(onNext: { value in
    print("Received value: \\(value)")
}, onError: { error in
    print("Received error: \\(error)")
}, onCompleted: {
    print("Stream completed")
})

observable.subscribe메서드를 사용해 Observable을 구독했는데 이를 통해서 데이터가 발행될 때 마다 onNext 클로저가 호출되고, 에러가 발생하거나 스트림이 완료되면 onError 혹은 onCompleted 클로저가 호출되는 방식이다!

 

이제 슬슬 이해가 잡히기 시작한 것 같다 🙂

 

그렇다면 이제 Observable을 사용하면서 유용한 연산자들도 같이 알아보자!

Observable에서 방출되는 데이터를 다양한 연산자를 사용해서 필터링하거나 변환할 수 있다.

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

let strings = numbers.map { number in
		return "Number: \\(number)"
}

strings.subscribe(onNext: { value in
		print(value)
})

** 출력값
Number: 1
Number: 2
Number: 3

map 연사자를 활용해서 이렇게 데이터를 출력할 수 있다.

let evenNumbers = numbers.filter { $0 % 2 == 0 }

evenNumbers.subscribe(onNext: { value in
    print(value)
})

** 출력값
2

filter를 활용해 특정 조건을 만족하는 데이터만 필터해 사용할 수 있다.

 

그 외에 flatMap 등 다양한 연산자를 활용할 수 있지만 오늘은 가장 많이 쓰는 map , filter만 알아보도록 하자 🙂

 

그리고 마지막으로 Observable의 메모리를 관리해주는 DisposeBag에 대해서 알아보면 RxSwift에서 Observable을 사용하게 되면서 중요하게 신경써야하는 부분은 바로 메모리 관리이다.

 

구독이 끝나지 않으면 메모리 누수로 이어질 수 있기 때문에 이를 방지하기 위해 DisposeBag을 사용한다. DisposeBag은 구독을 수집하고 DisposeBag이 해제될 때 모든 구독을 자동으로 해제하는 역할을 한다.

let disposeBag = DisposeBag()

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

이렇게 DisposeBag을 선언해 저장한 뒤 작업이 끝나는 부분에 선언해 사용해 주면 간단하게 사용이 가능하다!

 

RxSwift 처음에는 아예 감을 잡는 것도 조금 어려웠지만 이제 슬슬 감이 잡히고 어떻게 사용해야하는지 알 것 같다 ㅎㅎ 이정도 감을 잡으니 새로운 프로젝트 하고싶은 생각이 스믈스믈 든다 ㅎㅎ 어떤 걸 만들어볼지 한번 생각해 봐야겠다.

 

RxSwift를 이해하게 되면 Combine도 자연스럽게 이해할 수 있게 되니 바로 1석 2조.. 🙂

 

그럼 오늘은 여기까지!