새로운 observable들을 생성하는 연산자
: observer 메서드를 코드로 호출하여 처음(from scratch) observable 생성
Create 연산자를 사용해서 observable을 처음 만들 수 있습니다.
observer를 매개변수로 가지는 함수를 이 연산자에 전달합니다.
observer의 onNext, onError, onCompleted 메서드를 적절하게 호출하여 이 함수가 observable처럼 작동하도록 할 수 있습니다.
잘 만들어진 유한한 observable은 observer의 onCompleted나 onError 메서드를 정확히 한 번 호출해야합니다. 또한 그 이후에는 observer의 다른 메서드를 호출하지 않습니다.
array에서 element를 반환하는 observable 생성예제입니다.
func myFrom<E>(_ sequence: [E]) -> Observable<E> {
return Observable.create { observer in
for element in sequence {
observer.on(.next(element))
}
observer.on(.completed)
return Disposables.create()
}
}
let stringCounter = myFrom(["first", "second"])
stringCounter
.subscribe(onNext: { n in
print(n)
})
// 실행 시 아래를 출력합니다.
first
second
: 특정한 한 item만 방출(emit)하는 Observable을 생성합니다.
Just 연산자는 한 item을 해당 item만 방출하는 Observable로 변환합니다.
From 연산자와 유사하지만, From은 배열이나 iterable에서 방출할 item을 가져오는 반면 Just는 배열이나 iterable을 single item으로 그대로 방출합니다.
let source = Observable.just([1,2,3])
source2.subscribe {
print($0)
}
// 또는
Observable<[Int]>.just([1,2,3])
.subscribe(onNext: {
print($0)
})
//실행 시 아래를 출력합니다
next([1,2,3])
completed
// 또는
[1,2,3]
다양한 객체와 데이터 유형을 Observable로 변환합니다.
오직 배열만 받을 수 있으며, 배열안의 각각의 요소를 하나씩 emit 합니다.
let numbers = [1,2,3,4,5]
let source = Observable.from(numbers)
source.subscribe {
print($0)
}
// 또는
Observable.from([1,2,3,4,5])
.subscribe(onNext: {
print($0)
})
// 실행 시 아래를 출력합니다.
next(1)
next(2)
next(3)
next(4)
next(5)
completed
// 또는
1
2
3
4
5
: element를 여러개 가진 새로운 observable을 생성합니다.
하나 이상의 event를 emit 할 수 있는 observable sequence
Observable<Int>.of(1,2,3,4,5)
.subscribe(onNext: {
print($0)
})
// 실행 시 아래를 출력합니다.
1
2
3
4
5
Observable.of([1,2,3,4,5])
.subscribe(onNext: {
print($0)
})
// 실행 시 아래를 출력합니다.
[1,2,3,4,5]
: 어떠한 element도 배출하지 않지만 정상적으로 종료하는 observable 생성
Observable<Void>.empty()
.subscribe {
print($0)
}
// 실행 시 다음을 출력합니다.
completed
: 어떠한 element도 배출하지 않고 종료하지도 않는 observable 생성
Observable.never()
.subscribe(onNext: {
print($0)
}, onCompleted: {
print("completed")
})
// 실행 시 다음을 출력합니다
Empty, Never 연산자는 매우 구체적이고 제한된 행동을 하는 observable을 생성합니다.
주로 테스트를 위해 유용하게 사용됩니다.
: 연속적인 정수의 특정 범위를 방출하는 observable 생성
Observable.range(start:3, count:6)
.subscribe(onNext: {
print($0)
})
// 실행 시 다음을 출력합니다.
3
4
5
6
7
8
: observer가 구독할 때까지 observable을 생성하지 않고, 각 observer에 대해 새로운 observable을 생성
Defer 연산자는 observer가 구독할 대까지 기다린 후에 일반적으로 observable 팩토리 함수를 사용해서 observable을 생성합니다.
Defer 연산자는 각 observer에 대해 이 작업을 새로 수행하기 때문에 subscriber는 동일한 observable을 구독한다고 생각할 수 있지만, 실제로 각 subscriber는 고유한 개별 sequence를 가집니다.
var flip: Bool = false
let factory: Observable<String> = Observable.deferred {
flip = !flip
if flip {
return Observable.of("A")
} else {
return Observable.of("B")
}
}
for _ in 0...3 {
factory.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
}
// 실행 시 다음을 출력합니다.
A
B
A
B