1. 개요

- RxSwift는 편리하고 코드를 간단하기 위한 많은 함수들을 제공한다.(Operator)

 

1) just

- 원래 기본 문법에서는 Create로 함수 형태를 만들고 seal.onNext에 반환하는 데이터를 넣어줘야 했지만 이를 간략하게 표현하는 방법

- 들어온 데이터를 그대로  seal.onNext로 보내는 것과 같은 결과

- 배열도 그대로 보낼 수 있다.

        Observable.just("Hello World")
            .subscribe(onNext: { str in
                print(str)
            })
            .disposed(by: disposeBag)

[결과]

Hello World

        Observable.just(["Hello", "World"])
            .subscribe(onNext: { arr in
                print(arr)
            })
            .disposed(by: disposeBag)

[결과]

["Hello", "World"]

 

2) from

- 배열 형태로 들어온 데이터를 차례대로 하나씩 onNext로 넣어준다.

        Observable.from(["RxSwift", "In", 4, "Hours"])
            .subscribe(onNext: { obj in
                print(obj)
            })
            .disposed(by: disposeBag)

[결과]

RxSwift

In

4

Hours

 

3) map

- 중간에 map을 사용하는 경우 단계에 맞게 map이 실행된다.

- 이렇게 체이닝을 이용하여 흐름에 맞게 내려가는 구조를 Stream이라고 한다.

        Observable.just("Hello")
            .map { str in "\(str) RxSwift" }
            .subscribe(onNext: { str in
                print(str)
            })
            .disposed(by: disposeBag)

[결과]

Hello RxSwift

 

        Observable.from(["with", "곰튀김"])
            .map { $0.count }
            .subscribe(onNext: { str in
                print(str)
            })
            .disposed(by: disposeBag)

[결과]

4

3

4) filter

- 필터에 걸리는 것만 아래로 내려가고 나머지는 내려가지 않는다.

        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

 

5) 응용

- 이미지를 다운받고 처리하는 것을 just, map, filter를 이용해서 만들어보자.

- "800x600" => "800/600" => "https://picsum.photos/800/600/?random" => URL? => filter에서 nil인지 확인
   => URL! =>Data => UIImage? => 데이터 적용

        Observable.just("800x600")
            .map { $0.replacingOccurrences(of: "x", with: "/") }
            .map { "https://picsum.photos/\($0)/?random" }
            .map { URL(string: $0) }
            .filter { $0 != nil }
            .map { $0! }
            .map { try Data(contentsOf: $0) }
            .map { UIImage(data: $0) }
            .subscribe(onNext: { image in
                self.imageView.image = image
            })
            .disposed(by: disposeBag)

'앱 개발자 역량 > IOS' 카테고리의 다른 글

RxSwift ] 5. Scheduler, Side Effect  (0) 2019.07.19
RxSwift ] 4. 다양한 operator 확인 방법  (0) 2019.07.16
RxSwift ] 2. Disposable  (0) 2019.07.13
RxSwift ] 1. 개요 및 Observable  (0) 2019.07.13
ios ]AppStore 배포하기  (0) 2019.07.09

+ Recent posts