RxSwift minimal Observable.créer l'exemple de

<!-Actuellement, j'essaie de faire fonctionner RxSwift. Et je veux créer un personnalisé Observables. Mais je pense que je fais quelque chose de mal.

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.

Example

Mais quand je le lance j'obtiens l'erreur de compilation suivante:

Cannot Invoke 'substribeNext' with an argument list of type ((String) -> Void)
35
demandé sur Matthijn 2016-01-13 19:53:43

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-->!

61
répondu Svyatoslav 2016-11-25 07:52:56

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()
        }
    }
16
répondu Gregg 2017-03-02 00:37:03

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

1
répondu TheiOSChap 2017-04-20 17:16:32

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.

1
répondu GOrozco58 2018-02-28 20:14:20