2017-04-06 109 views
1

我努力RxSwift融入我的項目IOS使用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是觀察網絡調用的結果(無論成功是真是假),這樣我們就可以編寫額外的手柄基地結果(附加代碼將只在網絡完成後執行)。謝謝你的幫助。

回答

2

我想包你的功能於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 
    }) 

你可以確保您的otherFunction()僅會如果discoverMovies()取得成功結果,則稱爲被叫。

+0

非常感謝得到相當理想。這裏的關鍵是flatmap函數。我會盡力實施它 –