首页 文章

RxSwift最小的Observable.create示例

提问于
浏览
36

目前我正在努力让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自动完成 .

Example

但是当我运行它时,我得到以下编译错误:

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

5 回答

  • 18

    您可以使用 RxExamples 来更好地理解 RxSwift . 我在 RxSwift repo找到了它 . 它帮助我理解了RxSwift .

    好的,让我们尝试使用 AlamofireRxSwift 发送简单请求 . 首先我们编写请求函数:

    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

  • 0

    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)
                        observer.onCompleted()
                    }
                })
                return Disposables.create()
            }
        }
    
  • 64

    我建议建一个游乐场 . CocoaPods游乐场插件提供了设置游乐场的简便方法

    gem install cocoapods-playgrounds
    pod playgrounds RxSwift
    

    这使得它可以快速轻松地使用RxSwift,并且可以更快地尝试一些东西 . 根据我的个人经验,这是改善理解的最佳方式

  • 1

    尽可能使用traits是一个好主意,我建议你看看RxSwift文档和Traits文档Here.

    例如,当您创建API调用方法时,它通常会返回 Single Trait .

    然后可以做这样的事情:

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

    这是您可以在不同情况下使用不同方法的许多其他特征 .

  • 1

    使用create Observable的简单URLSession示例

    func createObservableExample() -> Observable<Any> {
        return Observable.create { observer -> Disposable in
            let dataTask: URLSessionDataTask = URLSession.shared.dataTask(with: URL(string: "https://jsonplaceholder.typicode.com/todos/1")!) { (data, response, error) in
                if let error = error {
                    observer.onError(error)
                    return
                }
                guard let data = data else {
                   return observer.onError(NSError(domain: "dataNilError", code: -10001, userInfo: nil))
                }
                do {
                    let json = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
                    observer.onNext(json)
                    observer.onCompleted()
                } catch {
                    observer.onError(error)
                }
            }
            return Disposables.create {
                dataTask.cancel()
            }
        }
    }
    

相关问题