swiftui - 如何使用 SwiftUI 每秒刷新一次 View

标签 swiftui

这是一个大问题。

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

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

  1. 我的(新)数据将从我的 REST API 下载
  2. 数据将添加到Core Data
  3. View (我正文中的一个简单列表)将最终更新。 (这实际上是我的问题)

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

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

最佳答案

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

例如,这段代码是一个 Observable 对象,它启动一个计时器,每秒启动一个网络请求,并将这些请求的结果分配给 @Published myData 属性,这将导致拥有的 View 要重建的此对象。每秒触发一个网络请求并假设它以正确的顺序返回可能是一个非常糟糕的主意,但如果这确实是您想要执行的操作,则此代码会执行此操作。

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)
  }
}

关于swiftui - 如何使用 SwiftUI 每秒刷新一次 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58738443/

相关文章:

list - SwiftUI,以编程方式选择列表中的一行

swift - 在 SwiftUI 组件之间共享 ViewModel

ios - SwiftUI:将 View 与其父 View 的中心对齐

events - 如何使用 SwiftUI 和 Combine 检测 Datepicker 的值变化?

swiftui - 在 SwiftUI 中使用 WCSession 向 Apple Watch 发送消息

ios - 有没有办法让 `genstrings` 与 `LocalizedStringKey` 一起工作?

swiftui - 对齐表单部分内的文本和文本字段

compiler-errors - 如何将Swift UI代码中的表达式分解为不同的子表达式?

swift - 通过 UIViewControllerRepresentable 实现复杂的 UIKit + SwiftUI 界面

iOS SwiftUI 搜索栏和 REST-API