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 |