如何在面向协议的网络中添加分页页面

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 将包含 pagelimit 或任何其他查询参数。

如果请求的 HTTPMethod 是 POST 并且需要在 body 中发送数据,您还可以为 bodyParameters 添加另一个参数。