@IBAction func exMap3() {
		Observable.just("800x600")
				// 컨커런시 하게 하기 위해서 observeOn
				.observeOn(ConcurrentDispatchQueueScheduler(qos: .default)) //  새 쓰레드
				.map { $0.replacingOccurrences(of : "x", with : "/") }
				.map {"<https://picsum.photo/\\($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)
}

//만약 just 부터 비동기 쓰레드로 작업하고 싶다면 subscribeOn 사용 위치는 아무대나 있어도 상관없음
@IBAction func exMap3() {
		Observable.just("800x600")
				// 컨커런시 하게 하기 위해서 observeOn
				.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .default)) //  새 쓰레드
				.map { $0.replacingOccurrences(of : "x", with : "/") }
				.map {"<https://picsum.photo/\\($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)
}

// side effect : 외부에 영향을 주는 부분 아래 코드에서는 유아이 그리는 부분 
// 1. subscribe 에서 허용
// 2. do 에서 허용 
@IBAction func exMap3() {
		Observable.just("800x600")
				// 컨커런시 하게 하기 위해서 observeOn
				.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .default)) //  새 쓰레드
				.map { $0.replacingOccurrences(of : "x", with : "/") }
				.map {"<https://picsum.photo/\\($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)
}