【问题标题】:How do I use RxSwift with AlamoFire and SwiftyJSON?如何将 RxSwift 与 AlamoFire 和 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 中吗?

【问题讨论】:

    标签: swift alamofire rx-swift swifty-json


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 2015-04-24
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多