![](/img/trans.png)
[英]How to display and recover from API errors in ViewController when using RxSwift
[英]API funtion using RxSwift
我想將使用閉包編寫的 API 請求代碼更改為 RxSwift。
例如,我想使用 getList() function 制作 rxGetList() function。
// This function cannot be modified.
func getList(success: @escaping ([String]) -> Void,
failure: @escaping (Error) -> Void) {
// Request to Server...
}
func rxGetList() -> Observable<String> {
// Using getList() function
// TODO
}
我應該在 TODO 部分寫什么代碼? 請給我一些建議。
滿足您的期望的最簡單方法是使用以下內容:
func rxGetList() -> Observable<String> {
return Observable.create { observer in
getList(success: { result in
for everyString in result {
observer.onNext(everyString)
}
observer.onCompleted()
}, failure: { error in
observer.onError(error)
})
return Disposables.create() {
// specify any action to be performed on observable dispose (like cancel URL task)
}
}
}
請注意,您已將[String]
指定為success
閉包的輸入類型。 如果不是拼寫錯誤,則上面的代碼適合。 如果你想要一個String
,它就像這樣簡單:
func rxGetList() -> Observable<String> {
return Observable.create { observer in
getList(success: { result in
observer.onNext(result)
observer.onCompleted()
}, failure: { error in
observer.onError(error)
})
return Disposables.create() {
// specify any action to be performed on observable dispose (like cancel URL task)
}
}
}
Petr Grigorev 的答案是正確的,但如果你想玩一些極端的 function 組合,這里有一種更高級的處理方法:
let rxGetList = Observable.create(rx_(getList(success:failure:)))
.flatMap { Observable.from($0) }
func rx_<A>(_ fn: @escaping (@escaping (A) -> Void, @escaping (Error) -> Void) -> Void) -> (AnyObserver<A>) -> Disposable {
{
fn(singleObserve($0), $0.onError)
return Disposables.create()
}
}
func singleObserve<A>(_ observer: AnyObserver<A>) -> (A) -> Void {
{
observer.onNext($0)
observer.onCompleted()
}
}
我不確定是否實際使用上述內容,但如果您有很多要包裝的函數,它可能有助於減少您必須編寫的代碼量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.