Nos*_*mus 8 swift swiftui combine ios13.3
尝试发出网络请求时,出现错误
finished with error [-999] Error Domain=NSURLErrorDomain Code=-999 "cancelled"
Run Code Online (Sandbox Code Playgroud)
如果我使用它URLSession.shared.dataTask而不是URLSession.shared.dataTaskPublisher它将在 IOS 13.3 上工作。
这是我的代码:
return URLSession.shared.dataTaskPublisher(for : request).map{ a in
return a.data
}
.decode(type: MyResponse.self, decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
Run Code Online (Sandbox Code Playgroud)
此代码适用于 IOS 13.2.3。
Pro*_*in8 12
你在这里有两个问题: 1. 就像@matt 说的,你的出版商活得不够久。您可以将 存储AnyCancellable为 instance var,或者我喜欢做的(并且似乎是 redux 最佳实践)使用store(in:)aSet<AnyCancellable>来保留它并在对象被释放时自动清理它。2. 为了启动您需要的实际网络请求sink或assign值。
所以,把这些放在一起:
var cancellableSet: Set<AnyCancellable> = []
func getMyResponse() {
URLSession.shared.dataTaskPublisher(for : request).map{ a in
return a.data
}
.decode(type: MyResponse.self, decoder: JSONDecoder())
.receive(on: DispatchQueue.main)
.replaceError(with: MyResponse())
.sink { myResponse in print(myResponse) }
.store(in: &cancellableSet)
}
Run Code Online (Sandbox Code Playgroud)
mat*_*att 10
您没有显示足够的代码,但根据症状很明显问题是什么:您的发布者/订阅者对象的寿命不够长。我敢说你的代码总是错误的,它似乎成功只是一个怪癖。确保您的发布者,尤其是您的订阅者保留在长期存在的对象中,例如实例属性,以便网络通信有时间进行。
这是一个如何使用数据任务发布者的工作示例:
class ViewController: UIViewController {
let url = URL(string:"https://apeth.com/pep/manny.jpg")!
lazy var pub = URLSession.shared.dataTaskPublisher(for: url)
.compactMap {UIImage(data: $0.data)}
.receive(on: DispatchQueue.main)
var sub : AnyCancellable?
override func viewDidLoad() {
super.viewDidLoad()
let sub = pub.sink(receiveCompletion: {_ in}, receiveValue: {print($0)})
self.sub = sub
}
}
Run Code Online (Sandbox Code Playgroud)
这会打印<UIImage:0x6000008ba490 anonymous {180, 206}>,这是正确的(正如您可以通过自己访问该 URL 看到的)。
我要说的一点是,如果你不说self.sub = sub,你就会得到你报告的错误:订阅者sub,它只是一个本地人,立即不存在,网络交易过早取消(错误你报道)。
编辑我认为代码是在.store(in:)方法存在之前编写的;如果我今天写它,我会使用它而不是sub属性。但原理是一样的。
| 归档时间: |
|
| 查看次数: |
3803 次 |
| 最近记录: |