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