Как использовать издателя в базовом классе и наблюдать за изменениями в двух разных подклассах?
У меня есть базовый класс, в котором я делаю вызов API и меняю состояние API так
class ProfileBaseViewModel {
@Published private(set) var apiState: APIState = .initial
private(set) var settingsData: SettingModel?
var cancellables: Set<AnyCancellable> = Set<AnyCancellable>()
func getSettingsData() {
apiState = .inProgress
interactor.getSettingsData()
.sink(receiveCompletion: { [weak self] error in
if case .failure(_) = error {
self?.apiState = .completed(didSucceed: false)
}
}, receiveValue: { [weak self] response in
guard let self: ProfileBaseViewModel = self else { return }
self.settingsData = response
self.apiState = .completed(didSucceed: true)
})
.store(in: &self.cancellables)
}
}
Этот базовый класс имеет две дочерние модели представления. Обратите внимание, что getSettingsData вызывается только в ProfileViewModel, это связано с тем, что SettingsVC помещается поверх ProfileVC, и ожидается, что ProfileVC/VM сделает вызов API, и в SettingsVC/VM будет наблюдаться только состояние API.
final class ProfileViewModel: ProfileBaseViewModel {
init() {
getSettingsData()
}
}
final class SettingViewModel: ProfileBaseViewModel {
}
Эти две модели представления привязаны к двум контроллерам представлений, например:
extension ProfileViewController {
func observeViewModel() {
self.viewModel.$apiState
.receive(on: DispatchQueue.main)
.sink { [weak self] state in
self?.handleAPIState(state: state)
}
.store(in: &super.cancellables)
}
private func handleAPIState(state: APIState) {
switch state {
case .initial:
break
case .inProgress:
///show loader
case .completed(let didSucceed):
///reload table
}
}
}
extension SettingsViewController {
func observeViewModel() {
self.viewModel.$apiState
.receive(on: DispatchQueue.main)
.sink { [weak self] state in
self?.handleAPIState(state: state)
}
.store(in: &super.cancellables)
}
private func handleAPIState(state: APIState) {
switch state {
case .initial:
break
case .inProgress:
///show loader
case .completed(let didSucceed):
///reload table
}
}
}
Это не работает должным образом, handleAPIState в SettingsVC вызывается только для начального состояния, а не для inProgress или завершено, он работает, как и ожидалось, для ProfileVC. Любая помощь приветствуется.