안녕하세요!! 소들입니다 🌴
참으로 오랜만입니다.. ???
저는 뭐 그동안 바쁘기도 했고.. 해외여행도 다녀왔고..
혹은 개발? 공부? 인생?과 심각한 슬럼프를 겪기도 했고..
(블로그 글이 단 한 글자도 써지지 않던 마법..)
에힝ㅠ ChatGPT랑 짱친 된 기념으로 다시 열심히 공부 해야죠ㅠ
이번에 공부할 내용은 Observable을 생성하는 Operator 몇 가지에 대해 배울 것입니다!
앞서 Observable이 무엇인지에 대해 공부를 했으니
크게 어려울 것은 없습니다!
모든 포스팅은 편의 말투로 합니다~!!
1. Observable을 생성하는 방법 (just, of, from, create)
Observable을 생성할 때 자주 사용하는
몇 가지 메서드에 대해서 알아볼 것임!!!
1-1. just
단 1개의 항목(item)만 방출하는 Observable Sequence를 생성합니다
?
코드로 이해를 해보쟈
let observable = Observable.just(1)
// or let observable = Observable<Int>.just(1)
|
위처럼 observable을 생성할 때
Observable이란 클래스의 just라는 메서드를 사용할 수 있는데,
이때 just는 단 한 개의 항목(위에서는 Int형 타입의 1)만 파라미터로 넘겨줄 수 있음!!
(이때 제네릭 타입은 명시해줘도 되고 안 해줘도 됨)
이제 이렇게 생성된 Observable을 구독할 경우, 어떻게 되냐면,
observable.subscribe(onNext: { (data) in
print(data)
},
onCompleted: {
print("onComplete")
},
onDisposed: {
print("onDispose")
})
|
앞으로의 구독 코드는 위 코드로 생각해주시면 되겠음!!!
쨌든 위처럼 해당 observable을 구독해서 확인해보면,
우리가 아까 파라미터로 넘겨준 "1"이라는 항목을 한번 방출하고
바로 complete 불려서 dispose 되어버리는 것을 볼 수 있음!!!
참고로, item이 방출되는 시점이 궁금하신 분은 직접 해보면 알겠지만,
해당 Observable을 구독하자마자 파라미터로 넣어둔 항목이 방출됨!!!
just는 정말 just(단지ㅎ) "한개"의 항목만 방출하고 dispose 되어버리기 때문에,
배열을 넣을 경우, 해당 배열 자체를 방출하고
let observable = Observable.just([1, 2])
|
만약 한 개 이상의 item을 파라미터로 넣을 시
let observable = Observable.just(1, 2) // error!
|
에러가 발생함! just ? 갱장히 쉽군
근데 만약 1개 이상의 item을 방출시키고 싶을 땐 어캄?
1-2. of
1개 이상의 항목(item)을 방출하는 Observable Sequence를 생성합니다
자문자답 폼 미쳤다
만약 1개 이상의 항목을 방출시키고 싶을 땐 of라는 메서드를 사용하면 됨!!!
let observable = Observable.of(1, 2, 3)
// or let observable = Observable<Int>.of(1, 2, 3)
|
위처럼 observable을 생성할 때 of라는 메서드를 사용할 수 있는데,
이때 of의 파라미터는 가변 파라미터이기 때문에, 위처럼 방출을 원하는 만큼 항목을 넘겨줄 수 있음!!!
이또한 마찬가지로 제네릭 타입을 명시하든 안 하든 상관은 없지만,
당연하게도 넘겨주는 파라미터들의 타입은 동일해야 함
이또한 구독을 해볼 경우,
우리가 아까 파라미터로 넘겨준 1, 2, 3이라는 항목을 순서대로 방출하고
바로 complete 불려서 dispose 되어버리는 것을 볼 수 있음!!!
이또한 해당 Observable을 구독하자마자파라미터로 넣어둔 항목이 방출됨!!!
파라미터 하나를 하나의 항목(item)으로 보기 때문에,
just와 마찬가지로 배열을 넣을 경우, 해당 배열 자체를 하나의 항목으로 방출함
왜 자꾸 배열을 넣을 경우 해당 배열 자체가 항목으로 방출되는 걸 알려주냐면,
배열을 넣었을 때 Element 를 하나씩 방출하는 메서드가 있기 때문이쥐
1-3. from
파라미터로 오직 하나의 배열만 받으며,
배열의 요소들을 순서대로 방출하는 Observable Sequence를 생성합니다
그림과 글만 봐도 이제 어느정도 예상이 갈 것 같은데
from 메서드를 사용할 경우,
let observable = Observable.from([1, 2, 3])
// or let observable = Observable<Int>.from([1, 2, 3])
|
위처럼 파라미터로 하나의 배열을 전달할 수 있음!!
그리고 이 Observable을 구독하면,
파라미터로 보낸 배열의 Element들이 순서대로 하나씩 방출되는 것을 볼 수 있음!!!ㅎㅎ
파라미터로 넘겨준 [1, 2, 3]이라는 배열을 순서대로 순회하여 1, 2, 3을 하나씩 방출하고
바로 complete 불려서 dispose 되어버리는 것을 볼 수 있음!!!
지금껏 공부한 것들은 모두 해당 Observable을 구독하면
파라미터로 전달한 항목이 순서대로 방출되고,
방출이 끝나면 complete가 불리면서 dispose되는 것을 봤음!!!
자, 그럼 여기서 한 가지 의문
아니 비동기 이벤트를 Observable로 만든다면서용,,
나는 어떤 API통신을 해서 결과값을 받은 다음에..
그 결과에 따라 onNext나 onCompleted, onError를 내 맘대로 방출하고 싶으면 어쩌죠,,,?
하는 분들을 위한 create
1-4. create
파라미터로 Observer를 매개변수로 받는 클로저를 전달받는 Observable Sequence를 생성합니다
매개변수로 받은 Observer의 onNext, onCompleted, onError 메서드를 직접 호출할 수 있습니다
클로저가 끝나기 전에 반드시 onCompleted이나 onError를 정확히 1번 호출해야 하며,
그 이후로는 Observer의 다른 어떤 메서드도 호출해선 안됩니다
살짝 설명이 어렵다고 느낄 수 있는데 정말 별 거 없음
먼저 create 메서드의 원형을 보면
위처럼 "Observer를 파라미터로 받고, Disposable을 반환하는 클로저"를
파라미터로 받는 것을 볼 수 있음!!!!
실제로 어떻게 사용하냐면,
let observable = Observable<String>.create { observer in
observer.onNext("첫 번째 방출")
observer.onNext("두 번째 방출")
observer.onCompleted()
observer.onNext("세 번째 방출")
return Disposables.create()
}
|
이렇게!!!
create 메서드 다음에 트레일링 클로저를 이용해서
파라미터로 받은 observer에게 언제 onNext를 통해 이벤트를 방출 할 것인지,
언제 onCompleted를 할지, 언제 onError를 방출할지를
직접 내가 클로저 안에서 호출할 수 있는 것임!!!
이렇게 할 경우, 유동적으로 클로저 내에서
내가 원하는 만큼 item을 onNext로 방출할 수도 있고!
원하는 시점에 onCompleted이나 onError를 호출해서 종료시킬 수도 있음!!
자, 여기서 다시 짚고 넘어가자면
onCompleted이나 onError가 호출되고 난 후엔 그 Observable은
dispose 되어버리기 때문에 더이상 어떠한 이벤트도 방출할 수 없음!!!
떄문에
이벤트가 끝나거나 에러가 발생했을 경우
observer에게 이 Observable이 더이상 이벤트를 방출하지 않는단 것을 알리기 위해
(클로저가 끝나기 전에) 반드시 onCompleted이나 onError 중 하나를 호출해야 하며,
그 이후로는 어떤 메서드도 호출해선 안됨
따라서 위 코드의 Observable을 구독하고 실행해보면,
이렇게 onCompleted이 불린 이후 작성된
observer.onNext("세 번째 방출") 는 방출되지 않는 것을 볼 수 있음!!
또, 해당 클로저의 반환 타입이 Disposable이기 때문에,
반드시 Disposable을 생성해서 return 해주어야 함!!
간단한 Observable 생성 연산자 살펴보기 끝 >_<
이 외에도 empty, never 등등은 다음 포스팅에서 살펴 볼게요!!
.
.
.
기다려주신 분들께
포스팅이 늦어 죄송합니다 ....... ㅠ_ㅠ
뭔가 개발자로서의 회의감도 들고 여러가지로 복잡한 달을 보낸 것 같은데
다시 화이팅 해봐야죠 :>
읽어주셔서 감사합니다! 오타 및 잘못된 내용은 언제든 댓글 주셔요!
'iOS > RxSwift' 카테고리의 다른 글
RxSwift) Subject (1/3) - Subject의 Observable 역할 (6) | 2023.09.09 |
---|---|
RxSwift) Observable 생성하기 2편(empty, never, range, interval, timer, defer) (4) | 2023.05.10 |
RxSwift) Dispose /Disposable / DisposeBag 이해하기 (11) | 2023.02.07 |
RxSwift) Observable, Observer, Subscribe 흐름 이해하기 (16) | 2023.01.10 |
RxSwift) RxSwift가 도대체 뭔데요(Reactive Programming) (21) | 2022.11.30 |