ObservedObject внутри ObservableObject не обновляет представлениеIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 ObservedObject внутри ObservableObject не обновляет представление

Сообщение Гость »


Я пытаюсь отобразить индикатор активности при выполнении асинхронного запроса. Я создал объект ActivityTracker, который будет отслеживать жизненный цикл издателя. Этот ActivityTracker является ObservableObject и будет храниться в модели представления, которая также является ObservableObject.

Похоже, что такая настройка не обновляет представление. Вот мой код:

struct ContentView: Просмотр { @ObservedObject var viewModel = ContentViewModel() var body: some View { VStack(интервал: 16) { Text("Счетчик: \(viewModel.tracker.count)\nPerforming: \(viewModel.tracker.isPerformingActivity? "true": "false")") Кнопка (действие: { _ = request().trackActivity(self.viewModel.tracker).sink { } }) { Текст("Запрос") } } } } класс ContentViewModel: ObservableObject { @Published var tracker = Publishers.ActivityTracker() } частный запрос функции() -> AnyPublisher { return Just(()).delay(для: 2.0, планировщик: RunLoop.main) .eraseToAnyPublisher() } Издатели расширений { последний класс ActivityTracker: ObservableObject { // ОТМЕТКА: Свойства @Published количество переменных: Int = 0 вар isPerformingActivity: Bool { количество возвратов > 0 } частные отменяемые переменные: [AnyCancellable] = [] частный let counterSubject = CurrentValueSubject(0) частная блокировка разрешения: NSRecursiveLock = .init() в этом() { counterSubject.removeDuulates() .receive(на: RunLoop.main) .Распечатать() .sink { счетчик [weak self] в self?.count = счетчик } .store(в: &cancellables) } // ОТМЕТКА: частные методы fileprivate func trackActivity( Издатель ofPublisher: AnyPublisher ) { издатель .receive(на: RunLoop.main) .handleEvents( получения подписки: { _ в self.increment() }, получитьВыход: ноль, getCompletion: { _ в self.decrement() }, полученияОтмена: { self.decrement() }, получитьЗапрос: ноль ) .Распечатать() .sink(receiveCompletion: { _ in }, takeValue: { _ in }) .store(в: &cancellables) } частная функция приращения() { блокировка.блокировка() отложить {lock.unlock() } counterSubject.value += 1 } частная функция декремент () { блокировка.блокировка() отложить {lock.unlock() } counterSubject.value -= 1 } } } расширение AnyPublisher { func trackActivity(_ ActivityTracker: Publishers.ActivityTracker) -> AnyPublisher { ActivityTracker.trackActivity(ofPublisher: self) вернуть себя } } Я также пытался объявить свой ActivityTracker как @Published, но результат тот же: мой текст не обновляется. Обратите внимание, что хранение трекера активности непосредственно в представлении будет работать, но это не то, что мне нужно.

Я что-то пропустил?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»