如何使用SwiftUI每秒刷新视图

这是一个大问题。

我想每秒更新视图主体中的项目(消息)列表。

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

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

如何在视图中每秒调用一次函数以进行刷新?我尝试首先使用init(),但是由于刷新了与计时器结合的项,因此我被锁定了在我这方面不稳定。

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

p416769127 回答:如何使用SwiftUI每秒刷新视图

此代码均不属于您的视图。它应该在单独的ObservableObject中。该视图将订阅它拥有的任何@ObservedObject,并且只要对象的@Published属性发生更改,它将自动重建。

例如,此代码是一个Observable对象,它启动一个计时器,该计时器每秒启动一个网络请求,并将这些请求的结果分配给@Published myData属性,这将导致拥有此Object的视图成为重建。每秒触发一个网络请求并假定它以正确的顺序返回可能是一个非常糟糕的主意,但是如果确实如此,那么您可以执行此代码。

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)
  }
}
本文链接:https://www.f2er.com/3148965.html

大家都在问