Я создаю приложение, используя SwiftUI, где представление root представляет собой представление с четырьмя вкладками. Одной из функций приложения является возможность проигрывать подкаст во время просмотра приложения. Как только звук начнет воспроизводиться, я хочу показать «мини-плеер» с простым управлением запуска / остановки, а также отслеживать текущий прогресс.
Для отслеживания прогресса у меня есть @EnvironmentObject
, введенный в представление root, которое публикует обновления времени воспроизведения и т. Д. c. так что мини-плеер может ответить. Проблема, которую я обнаружил, состоит в том, что каждый раз, когда значение времени воспроизведения изменяется, каждая вкладка перерисовывается (что плохо). Вот некоторый [упрощенный] код:
struct ContentView: View {
@EnvironmentObject var playerManager: PlayerManager
var body: some View {
TabView(selection: self.$selection) {
HomeView().tag(0)
View2().tag(1)
View3().tag(2)
View4().tag(3)
}
.overlay(
VStack {
if self.playerManager.showMiniPlayer {
MiniPlayerView()
}
}
)
}
}
class PodcastPlayerManager: NSObject, ObservableObject {
@Published private(set) var elapsedTime = ElapsedTime(progress: 0, duration: 0)
// ... Things happen that cause `elapsedTime` to update
}
Я помещаю запись в журнал в init()
функции View2
и ее постоянно вызывали ... что плохо.
Мой вопрос заключается в том, является ли это правильным / лучшим способом моделирования чего-то подобного с использованием SwiftUI? Я также подумал о введении PlayerManager
в сам MiniPlayer
, но я использовал читатель Geometry на ContentView
, чтобы помочь позиционировать плавающий MiniPlayer
. showMiniPlayer
- единственная переменная из PlayerManger
, с которой я сталкиваюсь в ContentView
... все остальное автономно в MiniPlayer
Представлении.