I want to invoke a URLSession publisher based on a timer publisher every 60 minutes.
It seems like this should be possible but not aware how to do it:
For instance;
struct Response: Codable {
// ... some fields here
}
class MyClass: ObservableObject {
@Published var response: Response? = nil
var cancelable : AnyCancelable?
func connectPoller() {
let timer = Timer.TimerPublisher(interval: 60 * 60, runLoop: .main, mode: .default)
// how to chain this?
// want to connect the timer to invoke the data task
URLSession.shared.dataTaskPublisher(for: URL(string: "some-url-here")!).tryMap() { element -> Data in
guard let httpResponse = element.response as? HTTPURLResponse,
httpResponse.statusCode == 200 else {
throw URLError(.badServerResponse)
}
return element.data
}.decode(type: Response?.self, decoder: JSONDecoder()).eraseToAnyPublisher()
.replaceError(with: nil).assign(to: \.response, on: self)
}
}