es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar la paginación en el protocolo, se puede agregar una nueva propiedad al protocolo Endpoint:

    var page: Int? { get }
    

    Luego, en la implementación de MovieDBResource, se puede establecer el valor de página correspondiente para cada caso:

    enum MovieDBResource {
        case popular(page: Int)
        case topRated(page: Int)
        case nowPlaying(page: Int)
        case reviews(id: Int, page: Int)
    }
    
    extension MovieDBResource: Endpoint {
        var base: String {
            return "https://api.themoviedb.org"
        }
    
        var path: String {
            switch self {
            case .popular(let page): return "/3/movie/popular?page=\(page)"
            case .topRated(let page): return "/3/movie/top_rated?page=\(page)"
            case .nowPlaying(let page): return "/3/movie/now_playing?page=\(page)"
            case .reviews(let id, let page): return "/3/movie/\(id)/reviews?page=\(page)"
            }
        }
    
        var page: Int? {
            switch self {
            case .popular(let page), 
                 .topRated(let page), 
                 .nowPlaying(let page), 
                 .reviews(_, let page):
                return page
            }
        }
    }
    
    

    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:

    func getReview(movie resource: MovieDBResource, page: Int? = nil, completion: @escaping (Result<movieitem, mdberror="">) -> Void) {
        var endpoint = resource
        if let page = page {
            endpoint = .reviews(id: resource.movieId, page: page)
        }
    
        fetch(with: endpoint.request, decode: { (json) -> MovieItem? in
            guard let movieResults = json as? MovieItem else { return nil }
            return movieResults
        }, completion: completion)
    }
    

    Finalmente, en el controlador de vista, se puede pasar el parámetro de página:

    swift
    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)
    }
    }
    </movieitem,>

Comments are closed.