简单的代码迅速转换为reactiveswift

时间:2017-04-10 09:22:13

标签: 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的样本/示例/教程,请告诉我。

1 个答案:

答案 0 :(得分:3)

ReactiveCocoa用于将动态数据(在您的viewmodel中保存)绑定到ViewController的UI。如果您的数据不是动态的(如果viewmodel在viewcontroller的生命周期中没有改变),则根本不需要使用reactivecocoa。但是,如果您的car变量将发生变化并且单个视图控制器将用于显示多个汽车,那么reactivecocoa将非常有用。您可以使用MutableProperty类来封装动态car变量,并创建信号,以便在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将这些信号绑定到UI,以便UI每次都使用新的汽车数据自动更新{{ 1}}已更新!

viewModel.car.value

所以你可以看到如果你只需要在视图控制器中显示一个不变的汽车对象,ReactiveCocoa是不需要的 - 但是,如果你的viewmodel在viewcontroller的整个生命周期中都在改变,那么reactivecocoa将会允许您将可变数据绑定到UI,以便在数据发生更改时您的视图会自动更新!