如何在面向协议的网络中添加分页页面
How add page for pagination in protocol oriented networking
我刚刚学习了如何创建面向协议的网络,但我只是不知道如何在协议中添加分页页面。我的设置是这样的
protocol Endpoint {
var base: String { get }
var path: String { get }
}
extension Endpoint {
var apiKey: String {
return "api_key=SOME_API_KEY"
}
var urlComponents: URLComponents {
var components = URLComponents(string: base)!
components.path = path
components.query = apiKey
return components
}
var request: URLRequest {
let url = urlComponents.url!
return URLRequest(url: url)
}
}
enum MovieDBResource {
case popular
case topRated
case nowPlaying
case reviews(id: Int)
}
extension MovieDBResource: Endpoint {
var base: String {
return "https://api.themoviedb.org"
}
var path: String {
switch self {
case .popular: return "/3/movie/popular"
case .topRated: return "/3/movie/top_rated"
case .nowPlaying: return "/3/movie/now_playing"
case .reviews(let id): return "/3/movie/\(id)/videos"
}
}
}
这是我的网络服务class方法
func getReview(movie resource: MovieDBResource, completion: @escaping (Result<MovieItem, MDBError>) -> Void) {
print(resource.request)
fetch(with: resource.request, decode: { (json) -> MovieItem? in
guard let movieResults = json as? MovieItem else { return nil }
return movieResults
}, completion: completion)
}
我如何在协议中添加页面以便我可以在 viewController 中调用和添加参数,目前我在 viewController 中的服务是这样的。我需要参数到 page
service.getReview(movie: .reviews(id: movie.id)) { [weak self] results in
guard let self = self else { return }
switch results {
case .success(let movies):
print(movies)
case .failure(let error):
print(error)
}
}
谢谢
您可以将它作为参数添加到您的枚举案例中,例如:
case popular(queryParameters: [String: Any])
您可以创建具有 buildRequest(_:Endpoint)
的 Router
class,在这里您可以获得 queryParameters
并将其添加到 url 将包含 page
和 limit
或任何其他查询参数。
如果请求的 HTTPMethod 是 POST
并且需要在 body 中发送数据,您还可以为 bodyParameters
添加另一个参数。
我刚刚学习了如何创建面向协议的网络,但我只是不知道如何在协议中添加分页页面。我的设置是这样的
protocol Endpoint {
var base: String { get }
var path: String { get }
}
extension Endpoint {
var apiKey: String {
return "api_key=SOME_API_KEY"
}
var urlComponents: URLComponents {
var components = URLComponents(string: base)!
components.path = path
components.query = apiKey
return components
}
var request: URLRequest {
let url = urlComponents.url!
return URLRequest(url: url)
}
}
enum MovieDBResource {
case popular
case topRated
case nowPlaying
case reviews(id: Int)
}
extension MovieDBResource: Endpoint {
var base: String {
return "https://api.themoviedb.org"
}
var path: String {
switch self {
case .popular: return "/3/movie/popular"
case .topRated: return "/3/movie/top_rated"
case .nowPlaying: return "/3/movie/now_playing"
case .reviews(let id): return "/3/movie/\(id)/videos"
}
}
}
这是我的网络服务class方法
func getReview(movie resource: MovieDBResource, completion: @escaping (Result<MovieItem, MDBError>) -> Void) {
print(resource.request)
fetch(with: resource.request, decode: { (json) -> MovieItem? in
guard let movieResults = json as? MovieItem else { return nil }
return movieResults
}, completion: completion)
}
我如何在协议中添加页面以便我可以在 viewController 中调用和添加参数,目前我在 viewController 中的服务是这样的。我需要参数到 page
service.getReview(movie: .reviews(id: movie.id)) { [weak self] results in
guard let self = self else { return }
switch results {
case .success(let movies):
print(movies)
case .failure(let error):
print(error)
}
}
谢谢
您可以将它作为参数添加到您的枚举案例中,例如:
case popular(queryParameters: [String: Any])
您可以创建具有 buildRequest(_:Endpoint)
的 Router
class,在这里您可以获得 queryParameters
并将其添加到 url 将包含 page
和 limit
或任何其他查询参数。
如果请求的 HTTPMethod 是 POST
并且需要在 body 中发送数据,您还可以为 bodyParameters
添加另一个参数。