簡體   English   中英

iOS使用RxSwift跟蹤異步網絡調用何時完成

[英]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.

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