Как использовать издателя в базовом классе и наблюдать за изменениями в двух разных подклассах?

У меня есть базовый класс, в котором я делаю вызов 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. Любая помощь приветствуется.

0 ответов

Другие вопросы по тегам