RxSwift Observable생성 (just, of, from, create)
Observable 생성하는 방법(just, of, from, create)
1. just
: 단 1개의 항목(item)만을 방출하는 Observable Sequence를 생성함
import UIKit
import RxSwift
class ViewController: UIViewController {
// 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag(가방)생성
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
test()
}
func test() {
let observable = Observable.just(1) // 이렇게 하면 Int형 타입의 1만 파라미터로 넘겨줄 수 있음
//or
// let observable = Observable<Int>.just(1)
// 제네릭 타입을 명시해줘도 되고 안해줘두됨 바로 위는 제네릭 형태를 명시해준 것
// let observable = Objservable.just([1, 2]) <- 배열 형태
observable.subscribe(onNext: { (date) in
print(date)
}, onCompleted: {
print("onComplete")
}, onDisposed: {
print("onDispose")
}).disposed(by: disposeBag)
}
}
// 출력
// 1 -> 배열 형태로 넣게되면 [1, 2] 로 출력됨
// onComplete
// onDispose
맨 처음 파라미터로 넘겨준 "1"이라는 항목을 한번 방출하고, 바로 complete를 불러오고 다음에 dispose를 불러오는 것을 볼 수 있음
즉, Observable을 구독하자마자 파라미터로 넣어둔 항목이 방출되고, 바로 dispose가 되어버리기 때문임.
just에서 한 개의 항목만을 방출하고 dispose 되어버리기 때문에 배열을 넣을 경우, 해당 배열을 방출함.
만약 한 개 이상의 item을 파라미터로 넣을 시 에러가 발생!
2. of
: 1개 이상의 item을 방출하는 Observable Sequence를 생성함.
import UIKit
import RxSwift
class ViewController: UIViewController {
// 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag(가방)생성
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
test1()
}
func test1() {
let observable = Observable.of(1, 2, 3)
// or
// let observable = Observable<Int>.of(1, 2, 3)
// 제네릭 타입을 명시해줘도 되고 안해줘도 되지만, 타입은 동일해야함!
observable.subscribe(onNext: { (date) in
print(date)
}, onCompleted: {
print("onComplete")
}, onDisposed: {
print("onDispose")
}).disposed(by: disposeBag)
}
}
// 출력
// 1
// 2
// 3
// onComplete
// onDispose
위처럼 observable을 생성할 때 of라는 메서드를 사용할 수 있는데, of의 파라미터는 가변 파라미터이기 때문에, 위처럼 방출을 원하는 만큼 넘겨줄 수 있음. 코드블럭에 설명했지만, 제네릭타입은 명시를 해도되고 안해도 되지만, 넘겨주는 파라미터들의 타입은 동일해야 함.
추가로, 파라미터로 넘겨준 1, 2, 3이라는 항목을 순서대로 방출하고, 바로 complete를 불러와서 dispose됨. 이또한 해당 Observable을 구독하자마자 바로 파라미터에 넣어둔 항목이 방출됨. 파라미터 하나를 하나의 item으로 보기 떄문에, just와 마찬가지로, 배열을 넣게되면 해당 배열 자체를 하나의 항목으로 방출함.
3. from
: 파라미터로 오직 하나의 배열만 받으며, 배열의 요소들을 순서대로 방출하는 Observable Sequence를 생성함.
import UIKit
import RxSwift
class ViewController: UIViewController {
// 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag(가방)생성
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
test2()
}
func test2() {
let observable = Observable.from([1, 2, 3])
// or
// let observable = Observable<Int>.from([1, 2, 3])
// 제네릭 타입을 명시해줘도 되고 안해줘도 되지만, 타입은 동일해야함!
observable.subscribe(onNext: { (date) in
print(date)
}, onCompleted: {
print("onComplete")
}, onDisposed: {
print("onDispose")
}).disposed(by: disposeBag)
}
}
// 출력
// 1
// 2
// 3
// onComplete
// onDispose
파라미터로 보낸 배열의 요소들이 순서대로 하나씩 방출됨. 파라미터로 넘겨준 [1, 2, 3]이라는 배열을 순서대로 순회하여 1, 2, 3을 하나씩 방출하고 바로 complete를 불러서 dispose되어버리는 것임.
지금 위의 것들은 모두 해당 Observable을 구독하면 파라미터로 전달한 항목이 순서대로 방출되고, 방출이 끝나면 complete가 불러지면서 dispose가 되는 것임.
그럼 이제 제일 중요한 API를 받아와서 결과값을 받고, 그 결과에 따라 onNext나 onCompleted, onError를 맘대로 방출하고 싶을 때 사용하는 create를 알아보자.
4. create
: 파라미터로 Observer를 매개변수로 받는 클로저를 전달받는 Observable Sequence를 생성함. 매개변수로 받은 Observer의 onNext, onCompleted, onError 메서드를 직접 호출할 수 있음. 클로저가 끝나기 전에 반드시 onCompleted나 onError를 정확히 1번 호출해야 하며, 그 이후로는 Observer의 다른 어떤 메서드도 호출해선 안됨.
import UIKit
import RxSwift
class ViewController: UIViewController {
// 구독을 끝낸 뒤 구독을 해제하기 위한 disposeBag(가방)생성
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
test3()
}
func test3() {
//Observable 선언
let observable = Observable<String>.create { observer in
// onNext로 이벤트 방출
observer.onNext("첫 번째 방출")
observer.onNext("두 번째 방출")
observer.onCompleted()
observer.onNext("세 번째 방출")
return Disposables.create()
}
// 구독
observable.subscribe(onNext: { value in
print("\(value)")
}).disposed(by: disposeBag)
}
}
// 출력
// 첫 번째 방출
// 두 번째 방출
이렇게 create 메서드 다음에 트레일링 클로저를 이용해 파라미터로 받은 observer에게 언제 onNext를 통해 이벤트를 방출할 것인지,
언제 onCompleted를 할지, 언제 onError를 방출할지를 내가 직접 클로저 안에서 호출할 수 있는 것임.
이렇게 할 경우, 클로저 내에서 내가 원하는 만큼 item을 onNext로 방출할 수 있고, 원하는 시점에 onCompleted나 onError를 호출해서 종료시킬 수도 있음.
여기서 왜 세 번째 방출이 나오지 않느냐, onCompleted나 onError가 호출되고 난 후엔 해당 Observable은 dispose가 되어버리기 때문에 더이성 어떠한 이벤트도 방출할 수 없기 때문이다.
Create 추가자료
https://leedoseo.tistory.com/170
출처 : 개발자 소들이
'Swift 언어 > RxSwift' 카테고리의 다른 글
RxSwift Subject의 Observable 역할 (1) | 2024.09.03 |
---|---|
RxSwift Observable 생성 (empty, never, range, interval, timer, defer) (0) | 2024.08.26 |
RxSwift Observable 흐름 (0) | 2024.08.25 |
RxSwift 개념 (0) | 2024.08.25 |