티스토리 뷰

Swift

[RxSwift] Observable, just, of, from

Kim_Baechu 2020. 12. 23. 11:19

Observable

ReactiveX에서 옵저버 Observable 구독한다. Obseravable이 배출하는 하나 또는 연속된 항목에 옵저버는 반응한다. 이러한 패턴은 동시성 연산을 가능하게 한다. 그 이유는 Observable이 객체를 배출할 때까지 기다릴 필요 없이 어떤 객체가 배출되면 그 시점을 감시하는 관찰자를 옵저버 안에 두고 그 관찰자를 통해 배출 알림을 받으면 되기 때문이다.

출처 : reactivex.io/documentation/ko/observable.html

 

Observable은 '관측가능한' 객체를 말합니다.

Observable이 어떤 값을 방출하면 옵저버가 그 값을 확인하는 것 입니다.

 

Just

let observable1 = Observable.just(1)

observable1.subscribe { event in
    print(event)
}

//next(1)
//completed

just는 하나의 값을 방출합니다.

observable1를 구독(확인)하니 1이 나오고 완료 메세지가 나옵니다.

 

 

Of

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

observable2.subscribe { event in
    print(event)
}

let observable3 = Observable.of([1, 2, 3])

observable3.subscribe { event in
    print(event)
}

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

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

of는 여러개의 값을 방출합니다.

observable2를 구독(확인)하니 1이 나오고 연속해서 2, 3이 나온 후 완료 메세지가 나옵니다.

observable3를 구독(확인)하니 [1, 2, 3]의 배열이 나오고 완료 메세지가 나옵니다.

 

From

let observable4 = Observable.from([1, 2, 3, 4, 5])

observable4.subscribe { event in
    print(event)
}

observable4.subscribe { event in
    if let element = event.element {
        print(element)
    }
}

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

//1
//2
//3
//4
//5

From은 배열의 값을 방출합니다.

observable4를 구독(확인)하니 배열이 나오고 연속해서 나온 후 완료 메세지가 나옵니다.

 

let subscription4 = observable4.subscribe(onNext: { element in
    print(element)
})

subscription4.dispose()

//1
//2
//3
//4
//5

observable은 옵저버가 게속해서 구독하기 때문에 메모리 누수가 생길 수 있습니다.

따라서 완료 후에는 dispose해줘야 합니다.

 

DisposeBag

let disposeBag = DisposeBag()

Observable.of("A", "B", "C")
    .subscribe{
        print($0)
    }.disposed(by: disposeBag)

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

DisposeBag은 dispose할 객체들을 담는 가방이라고 생각하시면 됩니다.

여러가지 Observable객체들을 이 가방에 담아서 dispose할 수 있습니다.

 

Observable, Create, Subscribe

Observable<String>.create { observer in
    observer.onNext("A")
    observer.onCompleted()
    observer.onNext("B")

    return Disposables.create()
}.subscribe(onNext: { print($0) },
            onError: { print($0) },
            onCompleted: { print("Completed") },
            onDisposed: { print("Disposed") }
)
.disposed(by: disposeBag)

//A
//Completed
//Disposed

Subscribe에는 onNext, onError, onCompleted, onDisposed가 있습니다.

처음에 A를 방출해서 print하고

onCompleted()를 호출해서 Completed를 print합니다.

그다음 B를 print할 것 같지만 이미 completed 됐기 때문에 onNext는 실행되지 않고

dispose되어 Disposed가 print됩니다.

 

댓글
공지사항