【问题标题】:How add page for pagination in protocol oriented networking如何在面向协议的网络中添加分页页面
【发布时间】:2022-01-06 20:12:11
【问题描述】:

我刚刚学习了如何创建面向协议的网络,但我只是不知道如何在协议中添加分页页面。我的设置是这样的

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"
        }
    }
}

这是我的网络服务类方法

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 中的服务是这样的。我需要页面参数

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)
            }
        }

谢谢

【问题讨论】:

    标签: swift networking protocols


    【解决方案1】:

    您可以将其作为参数添加到您的枚举案例中,例如: case popular(queryParameters: [String: Any])

    您可以创建具有buildRequest(_:Endpoint)Router 类,在这里您可以获取queryParameters 并将其添加到包含pagelimit 或任何其他查询参数的url。

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

    【讨论】:

    • 我明白你的建议,但我仍然不明白如何在路由器中使用 buildRequest。很抱歉我还是新手
    • buildRequest 是您的自定义方法,它以Endpoint 作为参数,并且您的endpoint 已经具有requestURL,所以您需要做的就是检查您是否有queryParameters,你会将这些项目解析为请求的url。所以您现在将拥有带有 url 的请求,并且已经向其中添加了查询参数。
    • 查看这篇文章会对你有帮助medium.com/flawless-app-stories/…
    猜你喜欢
    • 2014-07-15
    • 2022-01-23
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多