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

问题描述 投票:0回答:1

[我正在尝试学习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)上有一个观察员。在我的脑海中,应在myArray获取数据后立即触发subscribe onNext,但这没有发生。发生的情况是completed立即运行,然后JSON联网并进行了解析。当myArray获取新数据时,不会触发订阅。我错过了某些事情还是误解了RX的目的?

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

swift alamofire rx-swift swifty-json
1个回答
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>类型的观察者>

© www.soinside.com 2019 - 2024. All rights reserved.