1. Operator란?
Operator은 Observable을 생성하거나 변환해주는 도구이다. String에서 대문자를 소문자로 변환해주는 lowercased(), 배열에서 배열이 비어있는지 확인할 수 있는 isEmpty처럼 Observable에서도 다양한 연산을 쉽게 처리할 수 있도록 도와주는 것이 바로 Operator이다. 아래 ReactiveX의 링크를 보면 Operator의 종류가 다 나와 있는 것을 알 수 있는데 오늘은 가장 많이 쓰이는 Operator들을 정리할 예정이다. 나머지 Operator에 대한 내용은 아래 링크에 자세하게 나와있고 내용이 너무 없거나 간소화 되어 있는 함수들은 RxJava나 RxJS 탭에 가서 검색을 하면 더 자세히 알 수 있다.
http://reactivex.io/documentation
2. Create Operator
• Create
Observable<Int>.create { (observer) -> Disposable in
observer.on(.next(0))
observer.onNext(1)
//observer.on(.completed)
observer.onCompleted()
return Disposables.create()
}
가장 기본적으로 Observable을 생성하는 Operator이다.
원하는 타입을 설정하고 create() 함수를 통해 만들어 주면된다.
위 코드는 0과 1이라는 Int값을 방출하고 oncompleted()를 통해 종료된다.
저번 포스트에 자세히 설명했기 때문에 생략한다.
• Just
let disposeBag = DisposeBag()
let string = "hello world"
Observable.just(string)
.subscribe { event in print(event) }
.disposed(by: disposeBag)
//hello world
Observable.just([1, 2, 3])
.subscribe { event in print(event) }
.disposed(by: disposeBag)
//[1,2,3]
Just는 하나의 Observable을 생성하는 Operator이다.
첫번째는 String값의 인자를 받았기 떄문에 Observable<String>타입의 이벤트가 생성되고 subscribe를 통해 방출한다.
두번째는 Int 배열의 인자를 받아서 Observable<[Int]> 타입의 이벤트가 방출된다.
• Of
let disposeBag = DisposeBag()
Observable.of("hello", "rx", "swift")
.subscribe { element in print(element) }
.disposed(by: disposeBag)
//hello
//rx
//swift
Observable.of([1, 2], [3, 4], [5, 6])
.subscribe { element in print(element) }
.disposed(by: disposeBag)
//[1,2]
//[3,4]
//[5,6]
Just가 하나의 이벤트를 전달했다면 Of는 여러개의 이벤트를 생성하는 Operator이다.
첫 번째는 3개의 String Observable을 생성해서 한 개씩 이벤트를 전달하는 것을 볼 수 있다.
두 번째는 3개의 Int 배열 타입의 Observable을 생성해서 한 개씩 이벤트를 전달한다.
여기서 주의해야 할 점은 배열도 한개의 요소로 취급하는 것이다.
• From
let disposeBag = DisposeBag()
Observable.from([1,2,3,4,5])
.subscribe { element in print(element) }
.disposed(by: disposeBag)
//1
//2
//3
//4
//5
From은 배열로 전달되는 요소들을 하나씩 next 이벤트로 전달하는 연산자이다.
Of는 배열 기호 없이 요소들을 추가해야하고 From은 배열 기호안에 요소들을 넣어야한다.
배열 요소를 집어 넣으면 Of는 Observable<[Type]> 이고 From은 Observable<Type>이다.
3. Filtering Operator
• Element(at: Int)
let disposeBag = DisposeBag()
Observable.from([1,2,3,4,5,6,7,8,9])
.element(at: 0)
.subscribe {
print($0)
}
.disposed(by: disposeBag)
//1
element(at: )은 at 파라미터의 원하는 인덱스 값을 집어넣어서 해당 인덱스의 요소만 이벤트로 전달해주는 메서드이다.
0을 집어넣어서 0번 인덱스 안에 있는 1이 전달되는 것을 볼 수 있다.
• filter
let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Observable.from(numbers)
.filter({
$0 % 3 == 0
})
.subscribe {
print($0)
}
.disposed(by: disposeBag)
//3
//6
//9
filter은 해당 조건에 만족하는 요소들만 이벤트로 전달해주는 Operator이다.
3으로 나눴을 때 나머지가 0인 3, 6, 9가 이벤트로 전달되는 것을 알 수 있다.
• Skip
let disposeBag = DisposeBag()
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Observable.from(numbers)
.skip(3)
.subscribe {
print($0)
}
.disposed(by: disposeBag)
//4
//5
//.
//.
//.
//10
skip은 n개의 요소를 무시하고 방출하는 Operator이다.
파라미터로 3을 넣어서 3개의 이벤트를 무시하고 4부터 10까지 이벤트가 전달되는 것을 알 수 있다.
4. Transforming Operator
• Map
let disposeBag = DisposeBag()
let words = ["hello", "rx", "swift"]
Observable.from(words)
.map({
$0.count
})
.subscribe {
print($0)
}
.disposed(by: disposeBag)
//5
//2
//5
Map은 요소를 변환시켜주는 Operator이다.
String 값의 hello를 map을 통해 "hello".count를 써서 5로 변환시킨 후 이벤트를 전달한다.
• FlatMap
let disposeBag = DisposeBag()
let skills = ["hello", "rx", "swift"]
func stringToInt(_ word: String) -> Observable<Int> {
return Observable.create { observer in
observer.onNext(word.count)
observer.onCompleted()
return Disposables.create()
}
}
Observable.from(skills)
.flatMap{ stringToInt($0) }
.subscribe {
print($0)
}
.disposed(by: disposeBag)
//5
//2
//5
map과 같이 변환시켜주는 Operator이지만 return 타입이 Observable타입을 리턴하는 부분에서 다르다.
Flatmap은 observable 타입으로 변환시킬 때 사용한다.
stringToInt는 String 타입을 받아서 Observable Int로 리턴 시키는 함수이므로 map과 동일하게 글자 수가 이벤트로 전달되는 것을 알 수 있다.
'RxSwift' 카테고리의 다른 글
6. RxSwift Relay, Signal, Driver (0) | 2021.10.07 |
---|---|
5. RxSwift Subject (0) | 2021.10.03 |
4. RxSwift Operator(2) (0) | 2021.09.30 |
2. RxSwift Observable이란? (0) | 2021.09.02 |
1. RxSwift란? (0) | 2021.08.23 |