【发布时间】:2018-08-31 12:21:40
【问题描述】:
我正在尝试使用带有 alamofire 和 rxswift 的 api。我已经编写了方法,但是观察者的 onNext 只被调用一次。我正在尝试通过递归调用来做到这一点。这有什么问题? Api 将根据时间戳一次返回 10 个对象。所以我正在检查刚刚返回的数组是否包含 10 个对象。如果是,那么还有更多,如果不是,那就结束了。
func fetchPersonalization(fromList:[Personalization],timeStamp:Int) -> Observable<PersonalizationContainer>
{
let dictHeader = ["Accept":"application/json","regid" : pushtoken , "os" : "ios" , "token" : token , "App-Version" : "1324" , "Content-Type" : "application/json"]
return fetchPersonalizationUtil(dictHeader: dictHeader, timeStamp: timeStamp)
.flatMap { (perList) -> Observable<PersonalizationContainer> in
let persoList:[Personalization] = perList.list
let finalList = fromList + persoList
if(persoList.count==10){
let newTimeStamp = persoList.last!.lastModifiedAt! - 1
return Observable.merge(Observable.just(PersonalizationContainer(l: finalList, d: perList.data)),
self.fetchPersonalization(fromList:finalList,timeStamp: newTimeStamp)
)
//self.fetchPersonalization(fromList:finalList,timeStamp: newTimeStamp)
}else {
return Observable.just(PersonalizationContainer(l: finalList, d: Data()))
}
}
}
func fetchPersonalizationUtil(dictHeader:[String:String],timeStamp:Int) -> Observable<PersonalizationContainer>
{
return Observable<PersonalizationContainer>.create({ (observer) -> Disposable in
Alamofire.request("https://mranuran.com/api/hubs/personalization/laterthan/\(timeStamp)/limit/10/" ,headers: dictHeader).responseData { response in
if let json = response.result.value {
//print("HUBs JSON: \(json)")
do {
let list = try JSONDecoder().decode([Personalization].self, from: json)
let pContainer = PersonalizationContainer(l: list, d: json)
print("ANURAN \(list[0].name)")
observer.onNext(pContainer)
observer.onCompleted()
}catch {
print(error)
observer.onError(error)
}
}
else{
observer.onError(response.result.error!)
}
}
return Disposables.create()
})
}
我在 onNext 方法上设置了一个断点,它似乎只被调用了一次。在他们的官方 github repo 中坚持了几个小时和 RxSwift 的 GithubRepo 示例,我无法弄清楚他们在做什么。我的流程有什么问题?
【问题讨论】:
-
onCompleted 将停止观察者发射。尝试删除它,只有在完成后才调用它,不要期待更多的调用。
标签: swift alamofire reactive-programming rx-swift