ObservedObject внутри ObservableObject не обновляет представление ⇐ 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, но результат тот же: мой текст не обновляется. Обратите внимание, что хранение трекера активности непосредственно в представлении будет работать, но это не то, что мне нужно.
Я что-то пропустил?
Я пытаюсь отобразить индикатор активности при выполнении асинхронного запроса. Я создал объект 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, но результат тот же: мой текст не обновляется. Обратите внимание, что хранение трекера активности непосредственно в представлении будет работать, но это не то, что мне нужно.
Я что-то пропустил?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
IOS Swift SFSafariViewController обновляет новый URL-адрес и обновляет представление
Anonymous » » в форуме IOS - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-
-
-
ObservableCollections против ObservableObject против ObservableRecipient против ViewmodelBase?
Anonymous » » в форуме C# - 0 Ответы
- 73 Просмотры
-
Последнее сообщение Anonymous
-
-
-
ObservableCollections против ObservableObject против ObservableRecipient против ViewmodelBase?
Anonymous » » в форуме C# - 0 Ответы
- 58 Просмотры
-
Последнее сообщение Anonymous
-