Подтвердить что ты не робот

Пример минимального значения RxSwift Observable.create

В настоящее время я пытаюсь заставить RxSwift работать. И я хочу создать пользовательский Observable. Но я думаю, что я делаю что-то неправильно.

Я переделал то, что я делаю с этим минимальным образцом:

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()

Это правильно? В методе run метод subscribeNext автоматически заполняется XCode.

Пример

Но когда я его запускаю, я получаю следующую ошибку компиляции:

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

Ответ 1

Вы можете использовать RxExamples для лучшего понимания RxSwift. Я нашел его в RxSwift репо. Это помогло мне понять RxSwift.

Хорошо, попробуйте отправить простой запрос с помощью Alamofire и RxSwift. Сначала мы пишем функцию запроса:

 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() метод отправляет запрос и получает ответ от сервера с помощью Alamofire. Я использовал наблюдателя RxSwift для отправки сообщений об ошибках или ошибках. Во-вторых, мы должны назвать эту функцию. Вы можете использовать rx_tap для кнопки:

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)
        }
    }

Это мой простой пример. Надеюсь, это вам поможет. ReactiveX - огромные возможности. Удачи в изучении RxSwift!

Ответ 2

Эта реализация немного изменилась с помощью 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()
        }
    }

Ответ 3

Я бы предложил создать игровую площадку. Плагин для игровых площадок CocoaPods обеспечивает легкий способ настройки игровой площадки.

gem install cocoapods-playgrounds
pod playgrounds RxSwift

Это ускоряет и ускоряет работу с RxSwift и ускоряет поиск вещей. В моем личном опыте его лучший способ отполировать ваше понимание