使用 Combine 当服务器没有返回数据时处理成功响应

Handle success response when there is no Data returned by the server with Combine

我正在尝试使用 Combine Framework 实现网络连接,我可以使用以下代码从服务器获取数据,但是当服务器没有返回数据但请求成功时我遇到了一个问题。

   return URLSession.shared.dataTaskPublisher(for: request)
      .tryMap { response in
         print(response)
        guard let httpURLResponse = response.response as? HTTPURLResponse, 200..<299 ~= httpURLResponse.statusCode  else {
           throw CustomError.serverError
         }
         if response.data.isEmpty && 200..<299 ~= httpURLResponse.statusCode {
            //HOW TO HANDLE IF if there is no Data from server but request has been processed successfully
         }
         return response.data
        }
        .decode(type: R.self, decoder: decoder)
        .mapError{CustomError.map(error: [=10=])}
        .receive(on: RunLoop.main)
        .eraseToAnyPublisher()
}

能否请您指导我如何处理服务器没有返回数据时的成功响应。

如果我需要详细说明我的问题,请告诉我。

根据您的评论,由于您需要 return 类型 R 的值或“某物”以防成功但为空的数据响应,那么您可以构建一个 returns 一个可选的 R?.

您需要使用 flatMap 来处理这个分支:

return URLSession.shared.dataTaskPublisher(for: request)
    .tryMap { response -> Data in
        guard let httpURLResponse = response.response as? HTTPURLResponse, 
           200..<299 ~= httpURLResponse.statusCode {
           throw CustomError.serverError
        }
        return response.data
    } 
    .flatMap { data -> AnyPublisher<R?, Error> in
       if data.isEmpty {
          return Just(nil).setFailureType(to: Error.self).eraseToAnyPublisher()
       }

       return Just(data).decode(type: R?.self, decoder: decoder)
          .eraseToAnyPublisher()
    }
    .mapError {
       [=10=] as? CustomError ?? CustomError.map(error: [=10=])
    }
    .receive(on: DispatchQueue.main)
    .eraseToAnyPublisher()

上面的管道将return一个R?值,当数据为空时nil