I guess the following is better. But I'm not completely satisfied.
// ViewController //
import UIKit
import Combine
class ViewController: UIViewController {
// MARK: - Variables
var cancellable: AnyCancellable?
private var cancellableSet: Set<AnyCancellable> = []
// MARK: - Life cycle
override func viewDidLoad() {
super.viewDidLoad()
let urlStr = "https://api.github.com/repos/ReactiveX/RxSwift/events"
let viewModel = ViewModel(urlStr: urlStr, waitTime: 7.0)
viewModel.fetchData(urlText: viewModel.urlStr, timeInterval: viewModel.waitTime)
.sink { completion in
print("Done!")
} receiveValue: { dataModels in
print("Count: \(dataModels.count)")
}
.store(in: &cancellableSet)
}
}
// ViewModel //
import UIKit
import Combine
class ViewModel {
var anycancellables = Set<AnyCancellable>()
var urlStr: String
var waitTime: Double
init(urlStr: String, waitTime: Double) {
self.urlStr = urlStr
self.waitTime = waitTime
}
func fetchData(urlText: String, timeInterval: Double) -> Future<[DataModel], Error> {
return Future<[DataModel], Error> { promise in
let url = URL(string: urlText)!
var request = URLRequest(url: url)
request.timeoutInterval = timeInterval
let sessionConfiguration = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfiguration)
session.dataTask(with: request) { data, response, error in
if let error = error {
print("error: \(error.localizedDescription)")
promise(.failure("Failure" as! Error))
}
if let jsonData = data {
do {
let dataModels = try JSONDecoder().decode([DataModel].self, from: jsonData)
promise(.success(dataModels))
} catch {
print("Error while parsing: \(error)")
}
}
}.resume()
}
}
}