[英]iOS Use RxSwift to track when the async network call has completed
我正在努力將RxSwift集成到我的項目中
我寫了一個異步網絡請求,其結果是通過回調閉包傳遞。
這是我的網絡功能
func discoverMovies(for url: String, withPage page: Int, success: @escaping(Bool)->()) {
let requestUrl = "\(url)&page=\(page)"
requestGETURL(requestUrl, success: { (json) in
self.createOrUpdateMoviesList(from: json)
success(true)
}) { (error) in
print("Could not download due to \(error)")
success(false)
}
}
我的問題是我們如何注冊觀察網絡調用結果的Observable
(成功是對還是錯),以便我們可以基於結果編寫其他句柄(其他代碼僅在網絡完成后才執行)。
我會將您的函數包裝到Rx函數中:
func discoverMovies(for url: String, withPage page: Int) -> Observable<MoviesList>{
Observable.create{ observer in
let requestUrl = "\(url)&page=\(page)"
self.requestGETURL(requestUrl, success: { (json) in
// your createOrUpdateMoviesList(from:) function returns a MoviesList
let moviesList = self.createOrUpdateMoviesList(from: json)
observer.onNext(moviesList)
observer.onCompleted()
}) { (error) in
print("Could not download due to \(error)")
observer.onError(error)
}
return Disposables.create()
}
}
func otherFunction(withMovies list: MoviesList) -> Observable<Something> {
// blah blah blah...
}
現在,您可以將您的Rx函數與flatMap
運算符鏈接起來:
discoverMovies(for url: "the url", withPage page: 1)
.flatMap{ list in
otherFunction(withMovies: list)
}
.subscribe(onNext:{ something in
// ...
},
onError: { error in
// manage errors
})
您可以確保只有在discoverMovies()
成功的情況下,才能調用otherFunction()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.