reactiveswift reactivecocoa swift3 reactive-cocoa

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.