如何将RxSwift与AlamoFire和SwiftyJSON结合使用?

时间:2019-12-19 12:58:04

标签: swift alamofire rx-swift swifty-json

我正在尝试学习RxSwift,目前正在尝试将其与AlamoFireSwiftyJSON相关地使用,即观察JSON何时具有已下载,以便我可以parse使用。我有用于获取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中的数据,对吗?还是我误解了它的目的?

无论如何,我在myArraylet myObserver = Observable.from(myArray)上有一位观察员。在我的脑海中,subscribe onNext应该在myArray获取数据后立即触发,但这没有发生。发生的情况是completed立即运行,然后JSON进行网络连接和解析。 myArray获取新数据时不会触发订阅。我是否错过了某些事情或误解了RX的目的?

EDIT 还是等待,整个JSON处理和解析应该放在onNext中吗?

1 个答案:

答案 0 :(得分:0)

您需要创建观察者。这应该可以工作:

        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<People>类型的观察者

    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)