如何使用 SwiftUI 每秒刷新一次视图

Tri*_*let 1 swiftui

这是一个很大的问题。

我想每秒更新一次视图正文中的项目(消息)列表。

该函数将执行以下特定代码:

  1. 我的(新)数据将从我的 REST API 下载
  2. 数据将被添加到核心数据
  3. 视图(我体内的一个简单列表)将最终更新。(这实际上是我的问题)

如何在我的视图中每秒调用一个函数来执行此刷新?我首先尝试使用 init(),但之后我被锁定了,因为项目的刷新与定时器结合在我看来是不稳定的。

非常感谢您能给我带来的任何路径/线索。

Jos*_*ann 5

这些代码都不属于您的视图。它应该在一个单独的 ObservableObject 中。该视图将订阅它拥有的任何@ObservedObject,并且只要该对象@Published 属性发生更改,它就会重建自己。

例如,这段代码是一个 Observable 对象,它启动一个计时器,该计时器每秒启动一次网络请求,并将这些请求的结果分配给@PublishedmyData 属性,这将导致重新构建拥有此对象的视图。每秒触发一个网络请求并假设它以正确的顺序返回可能是一个非常糟糕的主意,但如果这真的是你想要做的,这段代码就会这样做。

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)
  }
}
Run Code Online (Sandbox Code Playgroud)