Search
Duplicate

RxSwift - Observable 생성하기 (just, of, from, create)

Created
2023/09/16 03:03
Tags
RxSwift

RxSwift - Observable 생성하기 (just, of, from, create)

 Observable을 생성하는 방법 (just, of, from, create)

 1. just

단 1개의 항목(item)만 방출하는 Observable Sequence를 생성합니다.
let observable = Observable.just(1) let observable = Observable<Int>.just(1)
Swift
복사
Observable을 생성할 때, Observable이란 클래스의 just 라는 메서드를 사용할 수 있는데,
이때 just 는 단 한 개의 항목만 파라미터로 넘겨줄 수 있다.
(이때, 제네릭 타입은 명시해줘도 되고 안 해줘도 된다)
이렇게 생성된 Observable을 구독할 경우,
observable.subscribe(onNext: { (data) in print(data) }, onCompleted: { print("onComplete") }, onDisposed: { print("onDispose") })
Swift
복사
해당 observable을 구독해서 확인해보면
1 onComplete onDispose
Shell
복사
우리가 아까 파라미터로 넘겨준 “1” 이라는 항목을 한번 방출하고, 바로 complete 불려서 dispose 되어버리는 것을 볼 수 있다.
참고로, item이 방출되는 시점은 해당 Observable을 구독하자마자 파라미터로 넣어둔 항목이 방출된다.
just 는 정말 단지 “한 개” 의 항목만 방출하고 dispose 되어버리기 때문에, 배열을 넣을 경우, 해당 배열 자체를 방출하고
let observable = Observable.just([1, 2])
Swift
복사
[1, 2] onComplete onDispose
Shell
복사
만약 한 개 이상의 item을 파라미터로 넣을 시
let observable = Observable.just(1, 2) // error!
Swift
복사
에러가 발생한다.

 2. of

1개 이상의 항목(item)을 방출하는 Observable Sequence를 생성한다.
만약 1개 이상의 항목을 방출시키고 싶을 때of 라는 메서드를 사용한다.
let observable = Observable.of(1, 2, 3) let observable = Observable<Int>.of(1, 2, 3)
Swift
복사
observable을 생성할 때 of 라는 메서드를 사용할 수 있는데,
이때 of 파라미터는 가변 파라미터이기 때문에, 위처럼 방출을 원하는 만큼 항목을 넘겨줄 수 있다.
이또한 마찬가지로 제네릭 타입을 명시하든 안하든 상관은 없지만,
넘겨주는 파라미터들의 타입은 동일해야한다.
1 2 3 onComplete onDispose
Shell
복사
우리가 아까 파라미터로 넘겨준 1, 2, 3 이라는 항목을 순서대로 방출하고,
바로 complete 불려서 dispose 되어버리는 것을 볼 수 있다.
이또한 해당 Observable을 구독하자마자 파라미터로 넣어둔 항목이 방출된다.
파라미터 하나를 하나의 항목(item)으로 보기 때문에,
just 와 마찬가지로 배열을 넣을 경우, 해당 배열 자체를 하나의 항목으로 방출한다.

 3. from

파라미터로 오직 하나의 배열만 받으며, 배열의 요소들은 순서대로 방출하는 Observable Sequence를 생성한다.
let observable = Observable.from([1, 2, 3]) let observable = Observable<Int>.from([1, 2, 3])
Swift
복사
이렇게 파라미터로 하나의 배열을 전달할 수 있다. 그리고 Observable을 구독하면
1 2 3 onComplete onDispose
Shell
복사
파라미터로 보낸 배열의 Element들이 순서대로 하나씩 방출되는 것을 볼 수 있다.
파라미터로 넘겨준 [1, 2, 3] 이라는 배열을 순서대로 순회하여 1, 2, 3 을 하나씩 방출하고, 바로 complete 불려서 dispose 되어버리는 것을 볼 수 있다.

 4. create

파라미터로 Observer를 매개변수로 받는 클로저를 전달받는 Observable Sequence를 생성한다.
매개변수로 받은 Observer의 onNext, onCompleted, onError 메서드를 직접 호출할 수 있다.
클로저가 끝나기 전에 반드시 onCompleted이나 onError를 정확히 1번 호출해야 하며,
그 이후로는 Observer의 다른 어떤 메서드도 호출해선 안된다.
위처럼 ‘Observer를 파라미터로 받고, Disposable을 반환하는 클로저 ’ 를 파라미터로 받는 것을 볼 수 있다.
let observable = Observable<String>.create { observer in observer.onNext("첫 번째 방출") observer.onNext("두 번째 방출") observer.onCompleted() observer.onNext("세 번쨰 방출") // onCompleted 이후에는 방출이 되지 않는다. return Disposables.create() }
Swift
복사
create 메서드 다음에 트레일링 클로저를 이용해서
파라미터로 받은 observer에게 언제 onNext를 통해 이벤트를 방출할 것인지,
언제 onCompleted를 할지, 언제 onError를 방출할지를
직접 내가 클로저 안에서 호출할 수 있는 것
이렇게 할 경우, 유동적으로 클로저 내에서
내가 원하는 만큼 item을 onNext로 방출할 수도 있고, 원하는 시점에 onCompleted나 onError를 호출해서 종료시킬 수 있다.
onCompleted나 onError가 호출되고 난 후에는 그 Observable은 dispose 되어버리기 때문에 더이상 어떠한 이벤트도 방출할 수 없다.
때문에, 이벤트가 끝나거나 에러가 발생했을 경우 observer에게 이 Observable이 더이상 이벤트를 방출하지 않는다는 것을 알리기 위해 (클로저가 끝나기 전에) 반드시 onCompleted나 onError 중 하나를 호출해야 한다.
그 이후로는 어떤 메서드도 호출해서는 안된다!
첫 번째 방출 두 번째 방출 onComplete onDispose
Shell
복사
이렇게 onCompleted 이 불린 이후 작성된
observer.onNext(”세 번째 방출”)는 방출되지 않는 것을 볼 수 있다.
또, 해당 클로저의 반환 타입이 Disposable이기 때문에, 반드시 Disposable을 생성해서 return 해주어야한다.

 Reference