簡體   English   中英

API 函數使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM