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
来观察网络调用的结果(成功是 true 还是 false),以便我们可以根据结果编写额外的句柄(额外的代码只会网络完成后执行)。
我会将您的函数包装到 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...
}
现在您可以使用 flatMap
运算符链接您的 Rx 函数:
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()
获得成功结果时才会被调用。
我正在努力将 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
来观察网络调用的结果(成功是 true 还是 false),以便我们可以根据结果编写额外的句柄(额外的代码只会网络完成后执行)。
我会将您的函数包装到 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...
}
现在您可以使用 flatMap
运算符链接您的 Rx 函数:
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()
获得成功结果时才会被调用。