swift3 - 简单的代码 swift 到 reactiveswift

标签 swift3 reactive-cocoa-5 reactive-swift

人们如何转换我的代码:

struct CarModel {
    var model: String?
    var make: String?
    var kilowatts: Int?
    var photoURL: String?

    init(model: String, make: String, kilowatts: Int, photoURL: String) {
        self.model = model
        self.make = make
        self.kilowatts = kilowatts
        self.photoURL = photoURL
    }
} 

和:

class CarViewModel {
    private var car: Car?

    static let HPperKW = 1.34102209

    var modelText: String? {
        return car?.model
    }
    var makeText: String? {
        return car?.make
    }
    var horsepowerText: String? {
        guard let kilowatts = car?.kilowatts else { return nil }
        let HP = Int(round(Double(kilowatts) * CarViewModel.HPperKW))
        return "\(HP) HP"
    }
    var titleText: String? {
        guard let make = car?.make, let model = car?.model else { return nil }
        return "\(make) \(model)"
    }
    var photoURL: URL? {
        guard let photoURL = car?.photoURL else { return nil }
        return URL(string: photoURL)
    }

    init(_ car: Car) {
        self.car = car
    }
}

到 ReactiveCocoa/ReactiveSwift。我读完了。有关 Reactive 的文档,但我不明白如何在我的代码中实现 Reactive API。 谁知道我需要怎么做,请告诉我。 还有谁知道最新版本 ReactiveCocoa/ReactiveSwift 的好的示例/示例/教程,请告诉我。

最佳答案

ReactiveCocoa 用于将动态 数据(保存在您的 View 模型中)绑定(bind)到 ViewController 的 UI。如果你的数据不是动态的(如果 viewmodel 在 vi​​ewcontroller 的生命周期中没有改变)你根本不需要使用 reactivecocoa。但是,如果您的 car 变量将发生变化,并且将使用单个 viewcontroller 显示多辆汽车,则 reactivecocoa 将非常有用。您可以使用 MutableProperty 类来封装动态 car 变量并创建信号,以便在汽车属性发生变化时更新 ViewController。

class CarViewModel {
  let car: MutableProperty<Car>

  init(_ car: Car) {
    self.car = MutableProperty(car)
  }

  var modelTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { $0.model }
  }

  var makeTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { $0.make }
  }

  var horsepowerTextSignal: SignalProducer<String, NoError> {
    return car.producer.map { car in
      let HP = Int(round(Double(car.kilowatts) * CarViewModel.HPperKW))
      return "\(HP) HP"
    }
  }

  var titleTextSignal: SignalProducer<String, NoError> {
    return car.producer.map {  "\($0.make) \($0.model)" }
  }

  var photoURLSignal: SignalProducer<URL?, NoError> {
    return car.producer.map { URL(string: $0.photoURL) }
  }
}

现在,我们有一堆信号表示随时间变化的 car 数据,并且可以使用 ReactiveCocoa 将这些信号绑定(bind)到 UI,这样 UI 就会自动更新新的汽车数据viewModel.car.value 更新时间!

class CarViewController: UIViewController {
  @IBOutlet modelLabel: UILabel!
  @IBOutlet makeLabel: UILabel!
  @IBOutlet horsepowerLabel: UILabel!
  @IBOutlet titleLabel: UILabel!
  @IBOutlet image: UIImageView!

  var viewModel: CarViewModel!

  override func viewDidLoad() {
    self.modelLabel.reactive.text <~ self.viewModel.modelTextSignal
    self.makeLabel.reactive.text <~ self.viewModel.makeTextSignal
    self.horsepowerLabel.reactive.text <~ self.viewModel.horsepowerTextSignal
    self.titleLabel.reactive.text <~ self.viewModel.titleTextSignal
    self.viewModel.photoURLSignal.startWithValues { [weak self] url in
      self?.setImageFromUrl(url)
    }
  }

  func displayNewCar() {
    self.viewModel.car.value = aRandomCar()
  }

  private func setImageFromUrl(url: URL?) {
    //download url and display in UIImageView
  }
  private func aRandomCar() -> Car {
    //return a Car object
  }
}

所以你可以看到,如果你只需要在你的 View Controller 中显示一个不变的汽车对象,那么 ReactiveCocoa 是不需要的——但是,如果你的 View 模型在 View Controller 的整个生命周期中都在变化,reactivecocoa 将允许你绑定(bind)您的可变数据到 UI,以便您的 View 在数据更改时自动更新!

关于swift3 - 简单的代码 swift 到 reactiveswift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43319367/

相关文章:

objective-c - ReactiveCocoa 5.0 中的 RACObserve(object, keyPath)

swift - react swift : How to subscribe to SignalProducer?

ios - ReactiveCocoa 5, ReactiveSwift 网络子请求处理 & 最佳实践

ios - 代码 8 : Type 'UserDefaults' has no member 'standard'

ios - Swift 3 PreviewView 创建了可选但无法将其连接到原始 AVCAM 类 PreviewView

ios - Swift 3 如何使用 SSL Pinning 和 AlamoFire 验证服务器证书?

ios - ReactiveCocoa 的循环绑定(bind),如何将一个值绑定(bind)到两个输入 UI 元素

ios - 如何从> 2个信号生成器中的任何一个触发 block ?

ios - 如何使用 ReactiveSwift 将有错误的信号转换为 NoError 信号? (并且要优雅)

ios - Xcode 中的 Alamofire 请求 "status_code"= 401