RxSwift minimal Observable.créer l'exemple de
j'ai distillé ce que je fais à cet échantillon minimale:
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()
Est-ce correct? Dans la méthode run, la méthode subscribeNext est autocompletée de cette façon par XCode.
Mais quand je le lance j'obtiens l'erreur de compilation suivante:
Cannot Invoke 'substribeNext' with an argument list of type ((String) -> Void)
4 réponses
Vous pouvez utiliser RxExamples
pour une meilleure compréhension RxSwift
. Je l'ai trouvé dans RxSwift
repo. Ça m'a aidé à comprendre RxSwift.
Ok, essayons d'envoyer une requête simple en utilisant Alamofire
et RxSwift
. Nous avons d'abord écrire fonction de demande:
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()
la méthode envoie la requête et obtient la réponse du serveur en utilisant Alamofire
. J'ai utilisé RxSwift
observateur pour envoyer des messages de succès ou d'erreurs. Deuxièmement, nous devons appeler cette fonction. Vous pouvez utiliser rx_tap
pour le bouton:
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)
}
}
ceci est mon exemple simple. Espérons que cela vous aide. ReactiveX
est une énorme opportunité. Bonne chance pour apprendre!--3-->!
cette implémentation a légèrement changé avec 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()
}
}
je suggère de mettre en place une aire de jeux. CocoaPods playground plugin fournit un moyen facile de se configurer playground
gem install cocoapods-playgrounds
pod playgrounds RxSwift
cela le rend rapide et facile de se moquer avec RxSwift et beaucoup plus rapide pour essayer des choses. Dans mon expérience personnelle, c'est la meilleure façon de polir votre compréhension
c'est une bonne idée d'utiliser les traits chaque fois que vous le pouvez, je vous suggère de jeter un oeil à la documentation Rxswift et à la documentation des Traits Ici.
par exemple, lorsque vous créez une méthode D'appel API, elle renvoie habituellement un Single
Trait de caractère.
Alors peut peut faire quelque chose comme ceci:
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()
}
}
ce sont beaucoup d'autres traits que vous pouvez utiliser dans différents cas avec différentes approches.