如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?

Posted

技术标签:

【中文标题】如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?【英文标题】:How do I use RxSwift with AlamoFire and SwiftyJSON? 【发布时间】:2019-12-19 12:58:04 【问题描述】:

我正在尝试学习RxSwift,目前我正在尝试将它与AlamoFireSwiftyJSON相关联,即观察何时下载JSON,以便我可以@987654325 @ 它。我有获取JSON的工作代码:

guard let myURL = URL(string: "https://api.myjson.com/bins/e5gjk") else  return 

var myArray = [People]()
let myObserver = Observable.from(myArray)

Alamofire.request(myURL, method: .get)
    .validate()
    .responseJSON response in
        guard response.result.isSuccess else 
            print("Error")
            return
        

        let json = JSON(response.result.value)

        for i in 0...json["employees"].count 
            let people = People()
            people.name = json["employees"][i]["firstName"].stringValue
            people.job = json["employees"][i]["job"].stringValue

            myArray.append(people)
        

        for i in myArray 
            print(i.name)
            print(i.job)
        


myObserver.subscribe(onNext: 
    print($0)
, onError:  error in
    print(error)
, onCompleted: 
    print("completed")
, onDisposed: 
    print("disposed")
).disposed(by: DisposeBag())

如您所见,我也解析了JSON。我猜RX 的重点是在解析后使用onNext 中的数据,对吗?还是我误解了它的目的?

无论如何,我在myArray 上有一个观察者:let myObserver = Observable.from(myArray)。在我看来,subscribeonNext 应该在 myArray 获取数据后立即触发,但这并没有发生。发生的情况是completed 立即运行,然后JSON 网络和解析发生。 myArray 获取新数据时不会触发订阅。我是否遗漏了什么或误解了RX 的目的?

编辑 或者等等,整个JSON 处理和解析应该在onNext 中吗?

【问题讨论】:

【参考方案1】:

你需要创建你的观察者。这应该有效:

        let observer = Observable<People>.create  (observer) -> Disposable in
            Alamofire.request(myURL, method: .get)
            .validate()
            .responseJSON  response in
                guard response.result.isSuccess else 
                    print("Error")
                    observer.on(.error(response.result.error!))
                    return
                
                let json = JSON(response.result.value)

                for i in 0...json["employees"].count 
                    let people = People()
                    people.name = json["employees"][i]["firstName"].stringValue
                    people.job = json["employees"][i]["job"].stringValue

                    observer.on(.next(people))
                    myArray.append(people)
                

                observer.on(.completed)

                for i in myArray 
                    print(i.name)
                    print(i.job)
                
           
           return Disposables.create()
        

然后您可以订阅Observable&lt;People&gt; 类型的观察者

    observer.subscribe  (event) in
        switch event 
        case .next(let people):
            print(people.job)
            print(people.name)
        case .error(let error):
            print("error \(error.localizedDescription)")
        case .completed:
            print("completed")
        
    .disposed(by: disposeBag)

【讨论】:

以上是关于如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxSwift 和 Alamofire 库调用来自另一个 API 的响应的 API?

使用 RxSwift 将 Alamofire 请求绑定到表视图

Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求

如何使用 RxSwift 和 alamofire 获得嵌套 api 调用的响应?

结合 Alamofire 和 RxSwift

RxSwift+Alamofire 自定义映射器错误处理