,ios,swift,http,swiftui,combine"/>

首页 > 解决方案 > 使用没有返回的 Swift 组合的 POST 请求不适用于 AnyPublisher

问题描述

我有一个 POST 请求向用户发送一条短信,该短信不返回任何内容,只返回状态码。我尝试返回 AnyPublisher<Void, CustomError> 但它不起作用。 在此处输入图像描述

这是我的通用请求方法的样子:

func request<T>(_ req: NetworkRequest) -> AnyPublisher<T, NetworkError> where T: Decodable, T: Encodable {
    let sessionConfig = URLSessionConfiguration.default
    sessionConfig.timeoutIntervalForRequest = TimeInterval(req.requestTimeout ?? requestTimeout)

    guard let url = URL(string: req.url) else {
        // Return a fail publisher if the url is invalid
        return AnyPublisher(
            Fail<T, NetworkError>(error: NetworkError.badURL("Invalid Url"))
        )
    }
    // We use the dataTaskPublisher from the URLSession which gives us a publisher to play around with.
    return URLSession.shared
        .dataTaskPublisher(for: req.buildURLRequest(with: url))
        .tryMap { output in
            // throw an error if response is nil
            guard output.response is HTTPURLResponse else {
                throw NetworkError.serverError(code: 0, error: "Server error")
            }
            return output.data
        }
        .decode(type: T.self, decoder: JSONDecoder())
        .mapError { error in
            // return error if json decoding fails
            NetworkError.invalidJSON(String(describing: error))
        }
        .eraseToAnyPublisher()
}

标签: iosswifthttpswiftuicombine

解决方案


看起来主要问题是你试图AnyPublisher<T,NetworkError>变成AnyPublisher<Void,NetworkError>.

你可以这样做:

service.request(request).map { _ in () }.eraseToAnyPublisher()

推荐阅读