Как обновлять представление каждую секунду, используя SwiftUI - PullRequest
0 голосов
/ 07 ноября 2019

это большой вопрос.

Я хотел бы обновлять список элементов (сообщений) в теле представления каждую секунду.

Функция будет выполнять этот конкретный код:

  1. Мои (новые) данные будут загружены из моего REST API
  2. Данные будут добавлены в Базовые данные
  3. Вид (простой список в моем теле)) будет наконец обновлено. (это на самом деле моя проблема)

Как вызывать функцию каждую секунду в моем просмотре, которая будет делать это обновление? Сначала я попытался использовать init (), но язаблокирован после того, как обновление элементов в сочетании с таймером было нестабильным с моей стороны.

Большое спасибо за любой путь / руководство, которое вы могли бы привести меня.

1 Ответ

2 голосов
/ 07 ноября 2019

Ни один из этого кода не принадлежит на ваш взгляд. Это должно быть в отдельном ObservableObject. Представление будет подписываться на любой принадлежащий ему объект @ObservedObject и будет перестраивать себя всякий раз, когда изменяются свойства этих объектов @Published.

Например, этот код является объектом Observable, который запускает таймер, который запускает сетевой запрос каждую секунду и присваивает емурезультат этих запросов к свойству @Published myData, что приведет к перестроению представления, которому принадлежит этот объект. Вероятно, очень плохая идея запускать сетевой запрос каждую секунду и предполагать, что он возвращается в правильном порядке, но если это действительно то, что вы хотите сделать, этот код сделает это.

import Combine

class MyObserableObject: ObservableObject {
  @Published var myData: [Int] = []
  private var subscription: AnyCancellable?
  init() {
    subscription = Timer
      .TimerPublisher(interval: 1, runLoop: RunLoop.main, mode: .default)
      .map { _ -> AnyPublisher<[Int], Never> in
        URLSession
        .shared
        .dataTaskPublisher(for: URL(string: "somefakeurl.com")!)
        .map(\.data)
        .decode(type: [Int].self, decoder: JSONDecoder())
        .replaceError(with: [])
        .eraseToAnyPublisher()
      }
      .switchToLatest()
      .receive(on: RunLoop.main)
      .assign(to: \.myData, on: self)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...