gpt4 book ai didi

swift - 为什么 URLSession.DataTaskPublisher 不发布值?

转载 作者:行者123 更新时间:2023-12-03 09:30:04 27 4
gpt4 key购买 nike

在 Xcode 11 beta 5 或 6 中,我现有的代码依赖于 URLSession.DataTaskPublisher停止工作。好像DataTaskPublisher从不发布任何值,但我不知道为什么。

我试过 .sink.handleEvents作为订阅者。我已经用 Just 测试了 .sink发布者并确认它在那里收到一个值。

我也试过给 DataTaskPublisher URL并给它一个 URLRequest .我尝试了对 API 的请求,包括授权 header ,以及对 google.com 和 apple.com 的基本请求。我试过使用 URLSession.shared并创建 URLSession 的新实例.我也试过有和没有 mapdecode运营商。

我用过 XCTest期望确认测试每次都超时,即使我给它一个 4 分钟的超时。

我刚刚创建了一个新的示例项目,并在根 View Controller 中使用以下代码复制了问题:

override func viewDidLoad() {
super.viewDidLoad()

print("view did load")

URLSession.shared.dataTaskPublisher(for: URL(string: "http://apple.com")!)
.handleEvents(receiveSubscription: { (sub) in
print(sub)
}, receiveOutput: { (response) in
print(response)
}, receiveCompletion: { (completion) in
print(completion)
}, receiveCancel: {
print("cancel")
}, receiveRequest: { (demand) in
print(demand)
})
}

该项目打印“ View 确实加载”,但没有打印任何其他内容。关于我在这里哪里出错的任何想法?谢谢!

最佳答案

我认为您的代码有两个问题,首先您只有一个发布者(handleEvent 返回一个发布者),其次该发布者超出范围并消失了。尽管它并不完全优雅,但它仍然有效。


import Combine
import SwiftUI

var pub: AnyPublisher<(data: Data, response: URLResponse), URLError>? = nil
var sub: Cancellable? = nil

var data: Data? = nil
var response: URLResponse? = nil

func combineTest() {
guard let url = URL(string: "https://apple.com") else {
return
}
pub = URLSession.shared.dataTaskPublisher(for: url)
.print("Test")
.eraseToAnyPublisher()
sub = pub?.sink(
receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let error):
fatalError(error.localizedDescription)
}
},
receiveValue: { data = $0.data; response = $0.response }
)
}

struct ContentView: View {
var body: some View {
Button(
action: { combineTest() },
label: { Text("Do It").font(.largeTitle) }
)
}
}


我在 SwiftUI 中做到了,这样我就不用担心了,我使用了 3 个变量,以便我可以更好地遵循。您需要使用 2 参数接收器,因为发布者的错误不是从不。最后,print() 仅用于测试并且效果很好。

关于swift - 为什么 URLSession.DataTaskPublisher 不发布值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com