250x250
반응형
05-11 14:06
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[RxSwift] Observable 기본 연산자(Operators) 사용법 본문

CS(컴퓨터 과학)/RxSwift

[RxSwift] Observable 기본 연산자(Operators) 사용법

billnjoyce 2020. 9. 16. 19:52
728x90
반응형
RxSwift의 Observable 기본 연산자(Operators)의 사용법에 대해서 살펴봅니다.

 

 

#. 개발 환경

  • Xcode 11.x 이상
  • Swift 5.x 이상
  • RxSwift 5.x 이상

 

 


 

 

Observable 기본 개념

 

지난 강의에서 살펴보았던 Observable의 기본 개념을 정리하면 크게 아래와 같습니다.

 

  • Observable(ObservableType)은 Sequence와 동일합니다.
  • Observable은 다양한 타입을 지원하기 위하여 제네릭을 형태를 취하고 있습니다.
  • Observable은 subscribe 메소드는 Sequence의 makeIterator 메소드와 동일합니다.
  • subscribe 연산자를 실행하여야만 구독자가 될 수 있으며 일련의 이벤트를 수신할 수 있습니다.
  • Observable의 이벤트는 기본적으로 next, error, completed 등 세가지의 이벤트가 있습니다.
  • 모든 흐름은 비동기적으로 동작한다.
  • Observable = Observable sequence = Sequence, 모두 다 같은 의미입니다.

지난 강의(Obvervables)joycestudios.tistory.com/86

 

[RxSwift] Observables(Sequences) : Observables의 기본 개념을 살펴보자

RxSwift의 Observables의 기본 개념에 대해서 살펴봅니다. #. 개발 환경 Xcode 11.x 이상 Swift 5.x 이상 RxSwift 5.x 이상 Concepts RxSwift의 가장 기본이 되는 개념이자 핵심 철학을 우선 살펴보겠습니다. 스마..

joycestudios.tistory.com

지난 기본 개념 강의에 이어서 이번 강의에서는 Observable 객체를 생성, 구독, 구독 취소 하는 등의 방법에 대해서 자세히 살펴보도록 하겠습니다.

 

 

 

 


 

 

Observable 객체 생성

 

Observable 객체 생성 방법 중에서 대표적으로 아래의 연산자들을 통한 생성 방법이 있습니다.

아래이 연산자 외에도 생성 방법은 여러개가 있으나 본 강의에서는 아래의 연산자들만 살펴보겠습니다.

 

  • create : 기본적인 생성 방법으로서 escape closure 방식으로 생성하는 연산자
  • just : 오직 하나의 Observable sequence만을 생성하는 연산자
  • of : 연속적인 리스트 데이터를 단일 요소로 가지며 Observable array 형태를 생성하는 연산자
  • from : 연속적인 리스트 객체를 각각 방출해주는 연산자, 오직 Array 형태만 취할 수 있다.
  • empty : 데이터를 하나도 갖지 않는 Observable 객체를 생성하는 연산자, completed 이벤트만 방출한다.
  • never : empty와 반대로 completed 이벤트 조차 방출하지 않는다.
  • range : 특정한 범위의 데이터를 갖는 Observable 객체를 생성하는 연산자

 

 

create

 

아래의 create 예제에서는 onComplete 이벤트 발생 후에 입력된(onNext) 값은 무시됨을 알 수 있다.

let disposeBag = DisposeBag()

Observable<String>.create({ (observer) -> Disposable in
    // 1
    observer.onNext("1")
    
    // 2
    observer.onCompleted()
    
    // 3
    observer.onNext("?")
    
    // 4
    return Disposables.create()
}).subscribe(
   onNext: { print($0) },
   onError: { print($0) },
   onCompleted: { print("Completed") },
   onDisposed: { print("Disposed") }
).disposed(by: disposeBag)

// 1
// Completed
// Disposed

 

또다른 create 예제로서 에러값을 입력한 예시로서 위와 마찬가지로 에러값 발생 이후에 흐름이 종료되었음을 알 수 있다.

let disposeBag = DisposeBag()

Observable<String>.create({ (observer) -> Disposable in
    // 1
    observer.onNext("1")
    
    // 5
    observer.onError(MyError.anError)
    
    // 2
    observer.onCompleted()
    
    // 3
    observer.onNext("?")
    
    // 4
    return Disposables.create()
}).subscribe(
   onNext: { print($0) },
   onError: { print($0) },
   onCompleted: { print("Completed") },
   onDisposed: { print("Disposed") }
).disposed(by: disposeBag)

// 1
// anError
// Completed
// Disposed

 

 

just

 

하나의 입력값만을 받아서 Observable 객체를 생성합니다.

let one = 1
     
let observable:Observable<Int> = Observable<Int>.just(one)


// 실제 데이터를 수신 받기 위해서 구독(subscribe)를 연산자를 실행한다.
observable.subscribe({
   print($0)
})

// next(값), completed 이벤트 표시가 같이 표시됨을 알 수 있다.

// next(1)
// completed


observable.subscribe(onNext: { (element) in
	print(element)
})

// 최종 next 실제 값만 출력하기 위하여 onNext 이벤트를 별도의 클로저로 정의해서 출력할 수 있다.
// 1

 

 

of

 

생성 시 입력받은 리스트를 통채로 next를 통하여 방출되고 있습니다.

let observable = Observable.of([one, two, three])
        
observable.subscribe({
   print($0)
})

// next([1, 2, 3])
// completed

 

 

from

 

of와 다르게 입력받은 리스트를 입력받은 순서대로 하나씩 방출됨을 알 수 있습니다.

let observable = Observable.from([one, two, three])
        
observable.subscribe({
    print($0)
})

// next(1)
// next(2)
// next(3)
// completed

 

 

empty

 

아래의 코드는 empty 연산자로 Observable 객체가 생성이 되고 onCompleted 이벤트만 방출됩니다.

empty 주요 용도는 즉시 종료 가능한 Observable를 리턴할 경우 혹은 0개의 값을 가지는 Observable를 리턴할 경우 사용할 수 있습니다.

let observable = Observable<Void>.empty()
     
observable.subscribe(
    onNext: { (element) in
        print(element)
    },
    onCompleted: {
        print("Completed")
    }
)

// Completed만 방출됨

 

 

never

 

아래의 코드는 empty와 반대로 onCompleted 이벤트조차 방출되지 않습니다.

let observable = Observable<Any>.never()
     
observable.subscribe(
    onNext: { (element) in
        print(element)
    },
    onCompleted: {
        print("Completed")
    }
)

 

 

range

 

range 연산자를 통하여 1부터 10까지의 숫자값을 입력하여 생성하였습니다.

let observable = Observable<Int>.range(start: 1, count: 10)
        
observable.subscribe(onNext: { (v) in
   print(v)
})
                
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10

 

 

 


 

 

 

Observable 구독

 

위의 생성에서도 볼 수 있듯이 최종 입력 값에 대한 값을 최종 방출 시키기 위해서는 subscribe라는 연산자를 호출하여야만 값이 순차적으로 방출되며 최종 완료 이벤트까지 받을 수 있습니다.

 

즉 Observable 객체는 subscriber, 즉 구독되기 전에는 아무런 이벤트도 보내지 않습니다.

 

실제 RxSwift에서 정의되어 있는 subsribe와 관련한 이벤트는 아래와 같이 되어 있음을 알 수 있습니다.

onNext: ((Element) throws -> Void)? = nil,
afterNext: ((Element) throws -> Void)? = nil,
onError: ((Swift.Error) throws -> Void)? = nil,
afterError: ((Swift.Error) throws -> Void)? = nil,
onCompleted: (() throws -> Void)? = nil,
afterCompleted: (() throws -> Void)? = nil,
onSubscribe: (() -> Void)? = nil,
onSubscribed: (() -> Void)? = nil,
onDispose: (() -> Void)? = nil)

대부분 onNext, onCompeted, onError 이벤트들을 자주 사용합니다.

해당 이벤트들을 적용한 코드를 살펴보면 아래와 같습니다.

let one = 1
let two = 2
let three = 3

let observable = Observable.from([one, two, three])
        
observable.subscribe(
    onNext: { (element) in
        print(element)
    },
    onError: { (error) in
        print(error)
    }, 
    onCompleted: {
        print("Completed")
    }
)

// 1
// 2
// 3
// Completed

 

 

 

 


 

 

 

Observable 구독 취소

 

이전 강의에서도 설명하였지만 구독을 하였으면 구독을 취소할 수도 있어야 할 것입니다.

그래야만 더이상의 불필요한 이벤트 수신을 막을 수 있으며 메모리 관리가 이루어질 수 있습니다.

 

앞선 강의에서도 살펴보았듯이 구독 취소를 위한 연산자로는 dispose와 DisposeBag 두 가지 방식이 있음을 살펴보았습니다.

다시 한번 예제 코드를 통하여 자세히 살펴보도록 하겠습니다.

let observable = Observable.of("A", "B", "C")
     
let subscription = observable.subscribe({ (event) in
    print(event)
})
     
// 개별 구독자의 구독을 취소한다.     
subscription.dispose()



let disposeBag = DisposeBag()
         
Observable.of("A", "B", "C").subscribe{
    print($0)
}.disposed(by: disposeBag) // 다수의 구독자에 대해서 구독 취소를 할 수 있다.

// next(A)
// next(B)
// next(C)
// completed

Observable.of(1, 2, 3).subscribe{
    print($0)
}.disposed(by: disposeBag) // 다수의 구독자에 대해서 구독 취소를 할 수 있다.

// next(1)
// next(2)
// next(3)
// completed

 

 

 


 

 

 

이상으로 RxSwift의 Observable 객체 생성, 구독, 구독 취소 등을 위한 기본적인 연산자들에 대해서 살펴보았습니다.

 

 

 

감사합니다.

 

 

 

 


[참고 자료(References)]

 

[1] RxSwift: ReactiveX for Swift : github.com/ReactiveX/RxSwiftgithub.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md

[2] [RxSwift] Creating Observables 정리 : gwangyonglee.tistory.com/60

[3] Ch.2 Observable : github.com/fimuxd/RxSwift/blob/master/Lectures/02_Observables/Ch2.%20Observables.md
[4] RxSwift 예제로 감잡기 : academy.realm.io/kr/posts/how-to-use-rxswift-with-simple-examples-ios-techtalk/

[5] RxSwift 기본 익히기 (2) — 9분 59 초 짜리 : medium.com/@trilliwon/rxswift-시작하기-2-9분-59-초-f42f28407e75

728x90
반응형
Comments