tutorial rxswift rxcocoa react programming book swift rx-swift

rxcocoa - rxswift tutorial



RxSwift minimal Observable.create example (4)

Actualmente estoy intentando hacer que RxSwift funcione. Y quiero crear un Observable personalizado. Pero creo que estoy haciendo algo mal.

He destilado lo que hago con esta muestra mínima:

import Foundation import RxSwift class Example { let exampleObservable : Observable<String> = Observable.create { (observer) in observer.on(.Next("hello")) observer.on(.Completed) return AnonymousDisposable { } } let exampleObserver : AnyObserver<String>? func run() { self.exampleObserver = exampleObservable.subscribeNext({ (text) -> Void in print(text) }) } } let ex = Example() ex.run()

¿Es esto correcto? En el método run, el método subscribeNext se autocompleta de esa manera por XCode.

Pero cuando lo ejecuto, obtengo el siguiente error de compilación:

Cannot Invoke ''substribeNext'' with an argument list of type ((String) -> Void)


Es una buena idea usar rasgos cada vez que pueda, le sugiero que eche un vistazo a la documentación de RxSwift y la documentación de Rasgos Here.

Por ejemplo, al crear un método de llamada API, por lo general, devuelve un Single rasgo.

Entonces puede hacer algo como esto:

func getSomething() -> Single<YourType> { return Single<YourType>.create { single in //perform API call //Then emmit success event single(.success(YourType)) //Or error event single(.error(Error)) return Disposables.create() } }

Estos son muchos otros rasgos que puede usar en diferentes casos con diferentes enfoques.


Esta implementación ha cambiado ligeramente con Swift 3 :

func observableFunc() -> Observable<Bool> { return Observable.create { observer in self.apiClient.fetchData(callback: { results, error in if let error = error { observer.onError(error) } if let results = results { observer.onNext(true) } }) return Disposables.create() } }


Puede usar RxExamples para comprender mejor RxSwift . Lo encontré en el repo RxSwift . Me ayudó a entender RxSwift.

Ok, intentemos enviar una solicitud simple usando Alamofire y RxSwift . Primero escribimos la función de solicitud:

func getApi() -> Observable<AnyObject?> { return create{ observer in let request = Alamofire.request(.GET, "http://someapiurl.com", parameters: nil) .response(completionHandler: { request, response, data, error in if ((error) != nil) { observer.on(.Error(error!)) } else { observer.on(.Next(data)) observer.on(.Completed) } }); return AnonymousDisposable { request.cancel() } } }

getApi() método getApi() envía la solicitud y obtiene la respuesta del servidor usando Alamofire . RxSwift observador RxSwift para enviar mensajes de éxito o errores. Segundo, debemos llamar a esta función. Puede usar rx_tap para el botón:

class ViewController: UIViewController { var disposeBag = DisposeBag() override func viewDidLoad() { super.viewDidLoad() getApi() // Set 3 attempts to get response .retry(3) // Set 2 seconds timeout .timeout(2, MainScheduler.sharedInstance) // Subscribe in background thread .subscribeOn(Dependencies.sharedDependencies.backgroundWorkScheduler) // Observe in main thread .observeOn(Dependencies.sharedDependencies.mainScheduler) // Subscribe on observer .subscribe( onNext: { data in do { let post = try NSJSONSerialization.JSONObjectWithData(data as! NSData, options: []) as! NSDictionary print(post) } catch { print(NSString(data: data as! NSData, encoding: NSUTF8StringEncoding)) return } }, onError: { error in print(error) }, onCompleted: { print("Completed") }, onDisposed: { print("Disposed") } ) .addDisposableTo(disposeBag) } }

Este es mi simple ejemplo. Espero que esto te ayude. ReactiveX es una gran oportunidad. Buena suerte en aprender RxSwift !


Sugeriría establecer un patio de recreo. El plugin CocoaPods playground proporciona una manera fácil de configurar el patio de recreo

gem install cocoapods-playgrounds pod playgrounds RxSwift

Esto hace que sea más fácil y rápido usar RxSwift y mucho más rápido para probar cosas. En mi experiencia personal es la mejor manera de pulir tu comprensión