1. Scheduler

- Observable은 기본적으로 Async하게 처리가 되지 않기 때문에 메인 쓰레드에서 돌아간다.

- 이를 해결하기위해 observeOn 을 사용한다

 

1) observeOn

- 스트림에서 이것을 사용하면 그 다음 줄부터 해당 쓰레드로 처리하게 된다.

- 별도의 쓰레드로 지정하여 사용하고 UI를 변경하는 경우 MainThread로 돌아오게 처리한다.

ConcurrentDispatchQueueScheduler.init(qos: .default) 에서 qos는 우선순위로 background, default 등이 있다.

   (background는 엄청 느림)

        Observable.just("800x600")
            .observeOn(ConcurrentDispatchQueueScheduler.init(qos: .default))
            .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) }
            .observeOn(MainScheduler.instance)
            .subscribe(onNext: { image in
                self.imageView.image = image
            })
            .disposed(by: disposeBag)
    }

 

2) subscribeOn

- 위와 같이할 경우 just는 MainScheduler로 돌아가고 .observeOn을 사용한 이후에야 별도의 쓰레드로 돌아가게 된다.

- 전체의 Default Schedule을 정하기 위해서는 subscribeOn을 사용해야한다.

- subscribeOn은 스트림 중에 어디에 써도 상관 없이 설정된다.

        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) }
            .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .default))
            .observeOn(MainScheduler.instance)
            .subscribe(onNext: { image in
                self.imageView.image = image
            })
            .disposed(by: disposeBag)

 

2. Side Effect

- 외부에 데이터를 전달해주는 것이다.

- 위의 코드를 보면 subscribe에서 image를 imageView에 넣어주는 부분에 해당한다고 볼 수 있다.

- 이를 허용해주는 부분은 subscribe, do 이렇게 두가지만 존재한다.(다른 곳에도 할 수는 있으나 목적이 맞지 않는다.)

 

1) Do

- subscribe와 다른 점은 반환 값이 Observable이기 때문에 스트림 중간에 스쳐가는 형태로 처리할 수 있다.

- 사용 방법은 subbscribe와 비슷하게 onNext, onError, onCompleted, onSubscribe, onSubscribed, onDispose를 처리한다.

        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) }
            .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .default))
            .observeOn(MainScheduler.instance)
            .do(onNext: { image in
                print(image?.size)
            })
            .subscribe(onNext: { image in
                self.imageView.image = image
            })
            .disposed(by: disposeBag)

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

RxSwift ] 7. Subject, 바인딩  (0) 2019.07.22
RxSwift ] 6. UI에 적용하기  (0) 2019.07.22
RxSwift ] 4. 다양한 operator 확인 방법  (0) 2019.07.16
RxSwift ] 3. Operator  (0) 2019.07.13
RxSwift ] 2. Disposable  (0) 2019.07.13

+ Recent posts