2017-04-06 111 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函数。我会尽力实施它 –