gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:29:40 25 4
gpt4 key购买 nike

我正在尝试学习RxSwift,目前我正在尝试将它与AlamoFireSwiftyJSON结合使用,也就是说,观察 JSON 何时下载,以便我可以解析它。我有用于获取 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)。在我看来,一旦 myArray 获取数据就应该触发 subscribe onNext ,但这并没有发生。发生的情况是立即运行 completed,然后进行 JSON 网络和解析。 myArray 获取新数据时不会触发订阅。我是否错过了什么或误解了 RX 的目的?

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

最佳答案

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

        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)

关于swift - 如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59410275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com