iOS/RxSwift

[RxSwift] Observable, Dispose, Create로 subscribe하기

Chafle 2022. 10. 25. 15:27
반응형

sequence = observable

 

얘네들은 기본적으로 값을 방출할 수 있다

 

subscribe 가능하고, 해당 event를 얻을 수 있다는 것

 

ex. 슬라이더 컨트롤이 있는 경우 슬라이더 컨트롤의 값을 구독할 수 있다고 가정

 

누군가 슬라이더를 움직일 때마다 업데이트된 값을 얻을 수 있다.

업데이트된 값을 얻기 위해 관찰 가능.

 


객체를 하나씩 만들어보면

 

 

let observable = Observable.just(1)

하나의 특정 요소를 관찰 가능 항목을 만드려는 변수.

 

 

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

함수가 아닌 다른 배열이나 요소를 관찰 가능한 항목으로 만들 수 있다.

 

 

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

배열을 관찰 가능한 항목으로 만들 수 있다.

 

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

 

Observable.ofObservable.from의 차이점은

 

of는 관찰가능 항목이 배열자체에 작동 / 전달하는 모든 항목 자체를 관찰 가능

from은 관찰 가능항목이 개별 요소에 대하여 작동 / 요소 각각 관찰 가능

 

 


subscribe하는법

 

subscribe를 하게 되면 값이나 변수에 액세스 할 수 있다

 

observable4를 subscribe해보면

 

observable4.subscribe { event in
    print(event)
}

 

반응형

 

 

이런 값을 얻을 수 있는데

 

이것은 값이나 배열의 내용이 무엇이든

실제가 아니다

 

1. event를 가져오고
2. event안에는 값이 포함돼 있음

 

 


 

 

그렇다면 우리는 어떻게 진짜 값을 얻을 수 있을까?

 

element를 사용해서 하나하나를 얻어내자

 

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

결과는 

 


 

만약 obervable.of로 값을 subscribe하려고 하면

observable3.subscribe { event in
    print(event)
}

한번에 모든 값을 얻을 수 있다

 

element로 구성요소를 print해보면

 

 

 

전체 구성요소를 print하는 것을 볼 수 있다

 


onNext를 사용하면 더 쉽게 unwraping하지 않고 엑세스할 수 있다

 

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

 

 


dispose(폐기)

 

 

subscribe - dispose는 묶어서 생각하자

 

dispose하지 않으면 메모리의 누수(memory leak)가 생길 수 있다.

 

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

 

 

disposebag 만들기

특정 observable개체를 처리할 수 있는데

관찰이 완료되는 시점에서 dispose 할 수 있다.

 

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

 

 


create를 활용하여 subscribe하기

 

아래와같이 create를 사용하여 추적하게되면

 

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를 생성하여 추적하고

onCompleted()명령을 하면, 이미 완료된 상태이므로 B를 생성하여도 출력하지 않는다.

반응형