我正在尝试学习RxSwift
,目前正在尝试将其与AlamoFire
和SwiftyJSON
相关地使用,即观察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
中的数据,对吗?还是我误解了它的目的?
无论如何,我在myArray
:let myObserver = Observable.from(myArray)
上有一位观察员。在我的脑海中,subscribe
onNext
应该在myArray获取数据后立即触发,但这没有发生。发生的情况是completed
立即运行,然后JSON
进行网络连接和解析。 myArray
获取新数据时不会触发订阅。我是否错过了某些事情或误解了RX
的目的?
EDIT
还是等待,整个JSON
处理和解析应该放在onNext
中吗?
答案 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)