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