Okay... The solution to my question is use of the Future guy.
class APIClient: NSObject {
var cancellables = [AnyCancellable]()
@Published var models = [MyModel]()
func fetchData(urlStr: String) -> Future<[MyModel], Error> {
return Future<[MyModel], Error> { [weak self] promise in
guard let url = URL(string: urlStr) else {
return promise(.failure("Failure" as! Error))
}
guard let strongSelf = self else { return }
URLSession.shared.dataTaskPublisher(for: url)
.map { $0.data }
.decode(type: [MyModel].self, decoder: JSONDecoder())
.replaceError(with: [])
.sink { completion in
if case .failure(let error) = completion {
promise(.failure(error))
}
} receiveValue: { promise(.success($0)) }
.store(in: &strongSelf.cancellables)
}
}
}
class ViewModel: NSObject {
@IBOutlet var apiClient: APIClient!
var cancellables = Set<AnyCancellable>()
@Published var dataModels = [MyModel]()
func getGitData() -> Future<[MyModel], Error> {
let urlStr = "https://api.github.com/repos/ReactiveX/RxSwift/events"
return Future<[MyModel], Error> { [weak self] promise in
guard let strongSelf = self else { return }
strongSelf.apiClient.fetchData(urlStr: urlStr)
.sink { completion in
if case .failure(let error) = completion {
promise(.failure(error))
}
} receiveValue: {
promise(.success($0))
print("view model: \($0.count)")
}
.store(in: &strongSelf.cancellables)
}
}
}