Skip to content

Instantly share code, notes, and snippets.

@unnnyong
Last active May 30, 2020 12:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save unnnyong/41ff29f0254d74fd11907d6e14d138c8 to your computer and use it in GitHub Desktop.
Save unnnyong/41ff29f0254d74fd11907d6e14d138c8 to your computer and use it in GitHub Desktop.
Example: RxSwift + RxCocoa
//
// 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