Swift Combineを使用してタイマーパブリッシャーを作成する 質問する

Swift Combineを使用してタイマーパブリッシャーを作成する 質問する

私はSwiftUI によるデータフロー WWDC トーク彼らのスライドには、SwiftUI ビューに接続されたタイマー パブリッシャーを使用し、時間に応じて UI を更新するサンプル コードが記載されています。

私はまったく同じことをしたいコードに取り組んでいますが、これをどのように実装し、UI 構造体に接続するかがわかりませんPodcastPlayer.currentTimePublisher。また、Combine に関するビデオもすべて視聴しました。

どうすればこれを実現できるでしょうか?

サンプルコード:

struct PlayerView : View {
  let episode: Episode
  @State private var isPlaying: Bool = true
  @State private var currentTime: TimeInterval = 0.0

  var body: some View {
    VStack { // ...
      Text("\(playhead, formatter: currentTimeFormatter)")
    }
    .onReceive(PodcastPlayer.currentTimePublisher) { newCurrentTime in
      self.currentTime = newCurrentTime
    }
  }
}

ベストアンサー1

ここでは、Combine タイマーの例を示します。グローバルを使用していますが、もちろん、シナリオに適用可能なもの (environmentObject、State など) を使用する必要があります。

import SwiftUI
import Combine

class MyTimer {
    let currentTimePublisher = Timer.TimerPublisher(interval: 1.0, runLoop: .main, mode: .default)
    let cancellable: AnyCancellable?

    init() {
        self.cancellable = currentTimePublisher.connect() as? AnyCancellable
    }

    deinit {
        self.cancellable?.cancel()
    }
}

let timer = MyTimer()

struct Clock : View {
  @State private var currentTime: Date = Date()

  var body: some View {
    VStack {
      Text("\(currentTime)")
    }
    .onReceive(timer.currentTimePublisher) { newCurrentTime in
      self.currentTime = newCurrentTime
    }
  }
}

おすすめ記事