swift3 - reactiveswift - reactivecocoa swift
Ejemplo simple de ReactiveSwift (1)
He leído la documentación , revisé su maravilloso ejemplo de Playground, busqué SO, y alcancé la extensión de mi google-fu , pero no puedo entender cómo usar ReactiveSwift.
Dado lo siguiente ...
class SomeModel {
var mapType: MKMapType = .standard
var selectedAnnotation: MKAnnotation?
var annotations = [MKAnnotation]()
var enableRouteButton = false
// The rest of the implementation...
}
class SomeViewController: UIViewController {
let model: SomeModel
let mapView = MKMapView(frame: .zero) // It''s position is set elsewhere
@IBOutlet var routeButton: UIBarButtonItem?
init(model: SomeModel) {
self.model = model
super.init(nibName: nil, bundle: nil)
}
// The rest of the implementation...
}
.... ¿cómo puedo usar ReactiveSwift para inicializar SomeViewController
con los valores de SomeModel
, luego actualizar SomeViewController
cada vez que SomeViewController
los valores en SomeModel
?
Nunca antes había usado reactivos, pero todo lo que leo me lleva a pensar que esto debería ser posible. Me está volviendo loco.
Me doy cuenta de que hay mucho más en ReactiveSwift de lo que estoy tratando de lograr en este ejemplo, pero si alguien pudiera usarlo para ayudarme a comenzar, lo agradecería mucho. Espero que una vez que obtenga esta parte, el resto simplemente "haga clic".
Primero querrá usar MutableProperty
lugar de tipos simples en su Modelo. De esta manera, puedes observar cambios en ellos.
class Model {
let mapType = MutableProperty<MKMapType>(.standard)
let selectedAnnotation = MutableProperty<MKAnnotation?>(nil)
let annotations = MutableProperty<[MKAnnotation]>([])
let enableRouteButton = MutableProperty<Bool>(false)
}
En su ViewController, puede enlazarlos y observar aquellos que sean necesarios:
class SomeViewController: UIViewController {
let viewModel: Model
let mapView = MKMapView(frame: .zero) // It''s position is set elsewhere
@IBOutlet var routeButton: UIBarButtonItem!
init(viewModel: Model) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
routeButton.reactive.isEnabled <~ viewModel.enableRouteButton
viewModel.mapType.producer.startWithValues { [weak self] mapType in
// Process new map type
}
// Rest of bindings
}
// The rest of the implementation...
}
Tenga en cuenta que MutableProperty
tiene tanto una .signal
como un .signalProducer
. Si necesita de inmediato el valor actual de una MutableProperty
(por ejemplo, para la configuración inicial), use .signalProducer
que envía inmediatamente un evento con el valor actual, así como cualquier cambio.
Si solo necesita reaccionar ante cambios futuros, use .signal
que solo enviará eventos para cambios futuros.
Reactive Cocoa 5.0 agregará enlaces de UIKit que puedes usar para unir directamente elementos de UI a tu capa reactiva, como hace con routeButton
en el ejemplo.