operator
Observable이 수행하는 메소드. Observable에서 파생되는 스트림을 구성하는 rxSwift의 핵심요소라고 할 수 있다.
Observable에는 수행가능한 여러가지 operator가 있는데, 그중 대표적인것들에 대해서 적어보려고 한다.
just()
static func just(_ element: [String]) -> Observable<[String]>
//returns an Observable sequence that contains a single element
Observable.just(_ element: )
입력 요소에 대해 그대로 반환되는 연산자이다. 예시를 통해 보자.
@IBAction func exJust1() {
Observable.just("Hello World")
.subscribe(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
}
//Hello World! 출력
@IBAction func exJust2() {
Observable.just(["Hello", "World"])
.subscribe(onNext: { arr in
print(arr)
})
.disposed(by: disposeBag)
}
//["Hello","World"] 출력
배열을 넣어도 배열이 통째로 출력되는 모습을 볼 수 있다.
from()
public static func from(_ array: [Element]) -> Observable<Element>
//Converts an array to an observable sequence.
Observable.from(_ array: [_])
배열의 원소들을 Observable의 형태로 리턴해준다.
@IBAction func exFrom1() {
Observable
.from(["RxSwift", "In", "4", "Hours"])
.subscribe(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
}
//RxSwift
//In
//4
//Hours 출력
from을 통해 나오는 Observable<String>형태의 원소들이 subscribe(OnNext: )부분에서 출력이 된다.
map()
func map<Result>(_ transform: @escaping (String) throws -> Result) -> Observable<Result>
//Projects each element of an observable sequence into a new form.
swift에서의 map()과 같은 동작을 하는 operator이다. Observable에서 생성되어 내려오는 데이터들에 closure에 적힌 동작에 따라 가공하여 리턴해준다.
@IBAction func exMap1() {
Observable.just("Hello")
.map { str in "\(str) RxSwift" }
.subscribe(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
}
//Hello RxSwift 출력
@IBAction func exMap2() {
Observable.from(["RxSwift", "ReactiveX"])
.map { $0.count }
.subscribe(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
}
//7
//9 출력
아마도 가장 많이 쓰게될 operator가 아닐까 생각된다.
filter()
func filter(_ predicate: @escaping (Int) throws -> Bool) -> Observable<Int>
//Filters the elements of an observable sequence based on a predicate.
swift의 filter()함수와 동일하게 동작하는 오퍼레이터이다. 서술한 조건에 맞는 경우에만 Observable을 내보낸다.
@IBAction func exFilter() {
Observable.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
.filter { $0 % 2 == 0 }
.subscribe(onNext: { n in
print(n)
})
.disposed(by: disposeBag)
}
//2
//4
//6
//8
//10 출력
배열요소들 중에 짝수인 요소만 출력된다.
stream
우리는 이러한 여러가지 오퍼레이터들을 통해 Observable을 가공하여 비동기 프로그래밍을 할 수 있게 된다. 앞의 글에서도 설명했지만 이러한 가공의 과정을 stream이라 부르기로 했고, 이러한 Observable을 통한 stream을 통해 비동기 프로그래밍을 할 수 있게 해주는 것이 RxSwift이다.
@IBAction func exMap3() {
Observable.just("800x600")
.map { $0.replacingOccurrences(of: "x", with: "/") } //"800/600"
.map { "https://picsum.photos/\($0)/?random" } //"https://picsum.photos/\800/600/?random"
.map { URL(string: $0) } //URL?
.filter { $0 != nil }
.map { $0! } //URL!
.map { try Data(contentsOf: $0) } //Data
.map { UIImage(data: $0) } //UIImage?
.subscribe(onNext: { image in
self.imageView.image = image
})
.disposed(by: disposeBag)
}
Observable이 여러가지 오퍼레이터를 통해 어떤식으로 변화하는지 주석으로 적어놓았다.
이외에도 정말 많은 오퍼레이터들이 있으며, 사용처에 따라 알맞은 오퍼레이터를 사용하면 된다. 각 오퍼레이터에 대한 상세한 내용들도 홈페이지에서 열람 가능하다.
[참고영상]
'iOS > RxSwift' 카테고리의 다른 글
scheduler (0) | 2022.08.31 |
---|---|
next, error, complete (0) | 2022.08.19 |
subscribe, dispose (0) | 2022.06.15 |
Observable stream (0) | 2022.06.08 |
ReactiveX (0) | 2022.05.30 |