在 SwiftUI 应用程序中放置音频播放代码的位置

Where to place code for audio playback in a SwiftUI app

在基于 SwiftUI 的应用程序中放置音频播放代码的最佳位置在哪里,即没有 UIViewController classes?我要播放的声音是由一个视图发起的,所以我想把它放到相应的视图模型中class。但作为一个模型 class 是关于数据的,我认为应该有更好的选择。最好的架构是什么?

正确,视图不应该处理数据。 SwiftUI 强制执行此逻辑。

您可以创建一个播放器 class 来播放音频。并将其添加为 EnvironmentObject,因此您可以使用 View 中的按钮控制它。然后你可以做一些甜蜜的事情,比如绑定你的播放按钮以显示不同的图像,具体取决于玩家是否正在......播放:)

更新 Xcode 11 beta 4 的代码已更新(willChange 而不是 didChange

struct PlayerView : View {
    @EnvironmentObject private var player: Player

    var body: some View {
        Button(action: {
            self.player.pauseOrPlay()
        }) {
            Image(systemName: player.isPlaying ? "pause.circle.fill" : "play.circle.fill").font(.title).frame(minWidth: 44, minHeight: 44)
        }
    }
}

class Player: BindableObject {
    let willChange = PassthroughSubject<Player, Never>()

    var isPlaying: Bool = false {
        willSet {
            willChange.send(self)
        }
    }

    func pauseOrPlay() {
        // Code that toggles the audio on and off
    }
}

虽然 Davide 的解决方案有效,但我最终使用单例模式来全局访问我的声音播放器对象,并且实际上将声音的触发从视图移回到模型 class。

看起来像这样:

class Player {
    static let shared = AudioPlayer()

    func pauseOrPlay() {
        // Code that toggles the audio on and off
    }
}

我现在可以从任何地方调用它了:

Player.shared.pauseOrPlay()