从 .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] =] Int
s,有些会 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") } )
我正在尝试 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] =] Int
s,有些会 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") } )