Swift 将 return AnyPublisher<Void, Error> 与 FlatMap 合并(POST 请求)

Swift Combine return AnyPublisher<Void, Error> with FlatMap (POST Request)

我开始使用 combine,它真的很酷,但目前我不知道如何修复它。我想使用 combine 发出一个 POST 请求,所以我必须解码数据,创建我的请求,发送它,然后 return 一个

AnyPublisher<Void, Error>

目前我的代码如下所示:

func postData<T>(withURL urlRequest: URLRequest, object: T) -> AnyPublisher<Void, Error> where T: Encodable {

        return Just(object)
        .encode(encoder: JSONEncoder())
        .mapError {
            let error = self.classifyError([=15=])
            return error
        }
        .map { data -> URLRequest in
            var request = urlRequest
            //BUILD REQUEST
            return request
        }
        .flatMap { request in
            let dataTaskPublisher: AnyPublisher<URLSession.DataTaskPublisher.Output, URLSession.DataTaskPublisher.Failure> = URLSession.DataTaskPublisher(request: request, session: .shared)

            return dataTaskPublisher
            .tryMap { try self.throwErrorOrContinue(data: [=15=], basedOnResponse: ) }
            .decode(type: T.self, decoder: JSONDecoder())
            .mapError { return self.handle(error: [=15=], from: urlRequest, object: T.self) }
        }
        .eraseToAnyPublisher()
    }

他告诉我:

Cannot convert return expression of type 'AnyPublisher<Publishers.FlatMap<_, Publishers.Map<Publishers.MapError<Publishers.Encode<Just<T>, JSONEncoder>, _>, URLRequest>>.Output, Publishers.FlatMap<_, Publishers.Map<Publishers.MapError<Publishers.Encode<Just<T>, JSONEncoder>, _>, URLRequest>>.Failure>' (aka 'AnyPublisher<_.Output, _>') 
to return type 'AnyPublisher<Void, Error>'

我尝试了一些映射,但没有用,我不知道他想从我这里得到什么。也许你们中的一个人知道这个问题?谢谢:)

你总是可以 mapVoid,这是一个空元组:

return URLSession.DataTaskPublisher(request: request, session: .shared)
    .tryMap { try self.throwErrorOrContinue(data: [=10=], basedOnResponse: ) }
    .decode(type: T.self, decoder: JSONDecoder())
    .mapError { return self.handle(error: [=10=], from: urlRequest, object: T.self) }
    .map { _ in return () }

另外 T 应限制为 Decodable

但实际上,我认为 postData 应该 return AnyPublisher<T, Error>。如何处理从服务器获取的数据应该由 postData 的调用者决定。因此,您应该改为更改 postData 的 return 类型。例如,如果调用者想忽略结果,它可以这样做:

Publishers.IgnoreOutput(upstream: postData(...))

这将创建一个 Publisher,其中 Never 而不是 Void 作为其 Output。发布者只会产生错误。