RxSwift

3. RxSwift Oporator(1)

Daesiker 2021. 9. 7. 17:46
반응형

1. Operator란?

Operator은 Observable을 생성하거나 변환해주는 도구이다. String에서 대문자를 소문자로 변환해주는 lowercased(), 배열에서 배열이 비어있는지 확인할 수 있는 isEmpty처럼 Observable에서도 다양한 연산을 쉽게 처리할 수 있도록 도와주는 것이 바로 Operator이다. 아래 ReactiveX의 링크를 보면 Operator의 종류가 다 나와 있는 것을 알 수 있는데 오늘은 가장 많이 쓰이는 Operator들을 정리할 예정이다. 나머지 Operator에 대한 내용은 아래 링크에 자세하게 나와있고 내용이 너무 없거나 간소화 되어 있는 함수들은 RxJava나 RxJS 탭에 가서 검색을 하면 더 자세히 알 수 있다.

http://reactivex.io/documentation

 

ReactiveX - Documentation

Getting Started Getting Binaries You can find binaries and dependency information for Maven, Ivy, Gradle, SBT, and others at http://search.maven.org. You need Java 6 or later. com.netflix.rxjava rxjava-core 0.19.0 If you need to download the jars instead o

reactivex.io


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