Last active
May 30, 2020 12:47
-
-
Save unnnyong/41ff29f0254d74fd11907d6e14d138c8 to your computer and use it in GitHub Desktop.
Example: RxSwift + RxCocoa
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ViewController.swift | |
// RxSwiftExample | |
// | |
// Created by Eunyeong Kim on 2020/05/27. | |
// Copyright © 2020 Eunyeong Kim. All rights reserved. | |
// | |
import UIKit | |
import RxSwift | |
import RxCocoa | |
struct Weather { | |
let cityName: String | |
let temperature: Double | |
let humidy: Double | |
} | |
struct APIClient { | |
static let shared = APIClient() | |
func requestWeather(city: String) -> Observable<Weather> { | |
Observable.just( | |
Weather(cityName: city, | |
temperature: 20, | |
humidy: 90) | |
) | |
} | |
} | |
final class ViewController: UIViewController { | |
@IBOutlet private weak var tempLabel: UILabel! | |
@IBOutlet private weak var humidityLabel: UILabel! | |
@IBOutlet private weak var cityNameLabel: UILabel! | |
@IBOutlet private weak var cityNameTextField: UITextField! | |
private let indicatorView = UIActivityIndicatorView() | |
private let disposeBag = DisposeBag() | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
let weather = cityNameTextField.rx.controlEvent(.editingDidEndOnExit) | |
.asObservable() | |
.map { [weak self] in self?.cityNameTextField.text } | |
.filter { ($0 ?? "").count > 0 } | |
.flatMapLatest { APIClient.shared.requestWeather(city: $0!) } | |
setupBinding(weather: weather) | |
} | |
} | |
private extension ViewController { | |
func setupBinding(weather: Observable<Weather>) { | |
let isIndicatorViewAnimating = Observable.from( | |
[cityNameTextField.rx.text.map { _ in true }, | |
weather.map { _ in false }.asObservable()] | |
).merge() | |
.startWith(true) | |
.asDriver(onErrorJustReturn: false) | |
isIndicatorViewAnimating | |
.skip(1) | |
.drive(indicatorView.rx.isAnimating) | |
.disposed(by: disposeBag) | |
[tempLabel, humidityLabel, cityNameLabel].forEach { view in | |
isIndicatorViewAnimating | |
.drive(view.rx.isHidden) | |
.disposed(by: disposeBag) | |
} | |
weather | |
.map { "\($0.temperature)도" } | |
.bind(to: tempLabel.rx.text) | |
.disposed(by: disposeBag) | |
weather | |
.map { "\($0.humidy)%" } | |
.bind(to: humidityLabel.rx.text) | |
.disposed(by: disposeBag) | |
weather | |
.map { "도시이름: \($0.cityName)" } | |
.bind(to: cityNameLabel.rx.text) | |
.disposed(by: disposeBag) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment