从 .dataTaskPublisher 中检索字符串

Retrieve String from `.dataTaskPublisher`

我正在尝试 return 来自我的 node.js Express 服务器的一个字符串。这是 return 的“你好,世界!”的基本服务器。但不是作为 JSON 对象,而是作为常规字符串。这是我的请求代码。

URLSession
    .shared
    .dataTaskPublisher(for: request)
    .map(\.data)
    .decode(type: String.self, decoder: decoder)
    .receive(on: DispatchQueue.main)

我认为我做对了,但我明白了,但是当我 运行 它时,我得到了这个错误:The data couldn't be read because it isn't in the correct format.

更新

所以,根据评论,我没有 returning JSON,所以我不能使用 JSONDecoder。也就是说,我想以一种通用的方式使用它,一些 API 会 return JSON 一些会 return String 一些会 [=36] =] Ints,有些会 return Array<Codable>。有没有办法使用 combine 来尝试从我的各种 API 端点取回这些值?

我知道我可以做这样的事情:

URLSession
    .shared
    .dataTaskPublisher(for: request)
    .map(\.data)
    .compactMap { String(data: [=11=], encoding:. utf8) }
    .receive(on: DispatchQueue.main)

但我希望能够使用此函数调用我的每个端点。有人可以帮忙吗?

您不需要解码器,只需使用字符串初始值设定项将数据转换为字符串即可。

var cancels: Set<AnyCancellable> = []

func fetchData() {

    URLSession
        .shared
        .dataTaskPublisher(for: request)
        .map(\.data)
        .compactMap { String(data: [=10=], encoding:. utf8) }
        .receive(on: DispatchQueue.main)
        .sink (
            receiveCompletion: {
                print("Completion: \([=10=])")
            },
            receiveValue: { result in
                print("String: \(result)")
            })
        .store(in: &cancels)
}

我个人放弃了拥有单一发布者链的想法,并且我有两次调用 HTML,另一个调用模型数据。但后来我发现了 sharedPublisher 的例子。虽然我坚持使用两次调用方法而不是这种方法,但至少它值得深思。我个人只会在 1 种情况下为模型调用数据调用,而在另一种情况下调用来自网页的 HTML 请求可以使用调用 HTML...

共享发布者让你在 .dataTaskPublisher(for:url)

之后中断
let sharedPublisher = urlSession
                      .dataTaskPublisher(for:url)
                      .share()

cancellable1 = sharedPublisher
                .tryMap() {return [=10=].data}
                .decode(type: T.self, JSONDecoder())
                .recieve(on: DispatchQueue.main)
                .sink(receiveCompletion: {}, receiveValue: {}

cancellable2 = sharedPublisher
                .map() { [=10=].response }
                .sink( receiveCompletion: {},
                       receiveValue: { response in print("html") } )