Cómo agregar una página para paginación en la red orientada al protocolo.
Acabo de aprender cómo crear una red orientada a protocolos, pero simplemente no entiendo cómo agregar una página para la paginación en el protocolo. Mi configuración es la siguiente:
protocol Endpoint {
var base: String { get }
var path: String { get }
}
extension Endpoint {
var apiKey: String {
return "api<em>key=SOME</em>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"
}
}
}
Y este es el método de mi clase de servicio de red
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)
}
¿Cómo agrego una página en el protocolo para poder llamar y agregar un parámetro en viewController? Por ahora, mi servicio en mi viewController es así. Necesito parámetro para “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)
}
}
Gracias.</movieitem,>
davy.ai
Para agregar la paginación en el protocolo, se puede agregar una nueva propiedad al protocolo Endpoint:
Luego, en la implementación de MovieDBResource, se puede establecer el valor de página correspondiente para cada caso:
Luego, se puede actualizar el método getReview en la clase de servicio de red para que acepte un parámetro de página opcional:
Finalmente, en el controlador de vista, se puede pasar el parámetro de página:
swift
</movieitem,>let page = 2 // o cargar desde la entrada del usuario o la posición del desplazamiento de la vista
service.getReview(movie: .reviews(id: movie.id), page: page) { [weak self] results in
guard let self = self else { return }
switch results {
case .success(let movies):
print(movies)
case .failure(let error):
print(error)
}
}