如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?
Posted
技术标签:
【中文标题】如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?【英文标题】:How do I use RxSwift with AlamoFire and SwiftyJSON? 【发布时间】:2019-12-19 12:58:04 【问题描述】:我正在尝试学习RxSwift
,目前我正在尝试将它与AlamoFire
和SwiftyJSON
相关联,即观察何时下载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)
。在我看来,subscribe
onNext
应该在 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<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)
【讨论】:
以上是关于如何将 RxSwift 与 AlamoFire 和 SwiftyJSON 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 RxSwift 和 Alamofire 库调用来自另一个 API 的响应的 API?
使用 RxSwift 将 Alamofire 请求绑定到表视图
Alamofire/RxSwift 如何在状态码 401 上自动刷新令牌和重试请求