私は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
}
}
}