我對 RxSwift 完全陌生。我設法加載了我的表格視圖,但現在我想每 10 秒打一次電話。
我在這里讀到我可能應該使用Observable<Int>.interval(10, scheduler: MainScheduler.instance),我嘗試了沒有太大的成功。
class MarketService: MarketServiceProtocol {
func fetchMarkets() -> Observable <[Market]> {
return Observable.create { observer -> Disposable in
RestManager.shared.makeRequest(withEndPoint: "market/v2/get-summary?region=US" , withHttpMethod: .get) { result in
if let error = result.error {
observer.onError(error)
return
}
guard let response = result.response,
200 ... 299 ~= response.httpStatusCode else {
return
}
guard let data = result.data else {
return
}
do {
let decodedData = try JSONDecoder().decode(MarketResult.self, from: data)
observer.onNext(decodedData.marketSummaryAndSparkResponse.markets)
} catch {
observer.onError(error)
}
}
return Disposables.create { }
}
}
}
然后我呼叫我的視圖控制器:
viewModel.fetchMarketViewModels().observe(on: MainScheduler.instance).bind(to: tableView.rx.items(cellIdentifier: HomeTableViewCell.cellIdentifier)) {
index, viewModel, cell in
guard let cell = cell as? HomeTableViewCell else { return }
cell.setupData(viewModel: viewModel)
}.disposed(by: self.disposableBag)
uj5u.com熱心網友回復:
你的 Observable.create 閉包有幾個問題。您必須確保observer在每條路徑中都將某些內容發送到,否則 Observable 將呼叫該函式,然后不發出任何內容,您將不知道為什么。
此外,您希望最小化傳遞給 create 的閉包中執行的邏輯量。你在那里做得太多了。
所以我們先盡量簡化create閉包中的代碼:
extension RestManager {
func rx_makeRequest(withEndPoint endPoint: String, withHttpMethod method: HttpMethod) -> Observable<(response: MyHTTPURLResponse, data: Data)> {
Observable.create { observer in
self.makeRequest(withEndPoint: endPoint, withHttpMethod: method) { result in
if let response = result.response, let data = result.data {
observer.onNext((response, data))
observer.onCompleted()
}
else {
observer.onError(result.error ?? RxError.unknown)
}
}
return Disposables.create() // is there some way of canceling a request? If so, it should be done here.
}
}
}
這是最低限度的。只包裝底層回呼,沒有別的。現在你的fetchMarkets電話要簡單得多:
class MarketService: MarketServiceProtocol {
func fetchMarkets() -> Observable <[Market]> {
return RestManager.shared.rx_makeRequest(withEndPoint: "market/v2/get-summary?region=US", withHttpMethod: .get)
.do(onNext: { result in
guard 200...299 ~= result.response.httpStatusCode
else { throw URLError.httpRequestFailed(response: result.response, data: result.data) }
})
.map { try JSONDecoder().decode(MarketResult.self, from: $0.data).marketSummaryAndSparkResponse.markets }
}
}
現在來談談你的問題。如何每 10 秒進行一次網路呼叫...只需將您的網路呼叫包裝在一個 flatMap 中,如下所示:
Observable<Int>.interval(.seconds(10), scheduler: MainScheduler.instance)
.flatMapLatest { _ in
viewModel.fetchMarketViewModels()
}
.observe(on: MainScheduler.instance)
.bind(to: tableView.rx.items(cellIdentifier: HomeTableViewCell.cellIdentifier)) { index, viewModel, cell in
guard let cell = cell as? HomeTableViewCell else { return }
cell.setupData(viewModel: viewModel)
}
.disposed(by: self.disposableBag)
flatMap從本文中了解有關及其變體的更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354975.html
上一篇:Swifui背景顏色沒有改變
