【发布时间】:2020-10-30 18:46:02
【问题描述】:
我正在尝试在进行网络调用时使用 CurrentValueSubject 创建刷新事件。因此,每当网络请求失败时,我可以按下按钮再次发出请求,但无法使其工作,因为失败事件将终止发布者并且它不会再次工作。
import Combine
import SwiftUI
struct ContentView: View {
@ObservedObject var viewModel: TestViewModel = TestViewModel()
var body: some View {
Button("Test", action: viewModel.test)
Button("Refresh", action: viewModel.refresh)
}
}
class TestViewModel: ObservableObject {
var bag = Set<AnyCancellable>()
private let changeSubject = CurrentValueSubject<Void, Never>(())
func test() {
changeSubject
.flatMap { self.networkPublisher }
.sink(
receiveCompletion: {
switch $0 {
case .failure:
print("Failure")
case .finished:
print("Finished")
}
},
receiveValue: {
print("Value: \($0)")
}
)
.store(in: &bag)
}
func refresh() {
changeSubject.send(())
}
var networkPublisher: AnyPublisher<String, Error> {
var url = URLRequest(url: URLComponents(string: "www.google.com")!.url!)
url.httpMethod = "GET"
return URLSession.shared
.dataTaskPublisher(for: url)
.tryMap { _ -> String in "Result" }
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
}
要解决这个问题,我可以使用.tryCatch { _ -> Just<String> in Just("Error") } 来捕获错误,这将阻止发布者终止。但是为什么发布者终止时它不起作用?完成活动后如何工作?
【问题讨论】: