我正在尝试使用以下结构播放随机广播电台:
struct RadioStreamer {
let streamingURL: URL
var radios = ["https://a", "https://b.mp3", "https://c.mp3", "d.mp3", "e.mp3"]
private let player: AVPlayer?
private let playerItem: AVPlayerItem?
init() {
self.streamingURL = URL (string:radios.randomElement()!)!
print(radios.randomElement() as Any)
self.playerItem = AVPlayerItem(url: self.streamingURL)
self.player = AVPlayer(playerItem: self.playerItem)
}
public func playStreaming() { self.player?.play() }
public func pauseStreaming() { self.player?.pause() }
}
然后在SwiftUI中
struct ContentView: View {
var streamer = RadioStreamer()
Button(action: {
self.streamer.pauseStreaming()
self.streamer.playStreaming()
}) {
Image(systemName: "forward.end").resizable()
.frame(width: 45, height: 45)
.aspectRatio(contentMode: .fit)
.foregroundColor(.buttonColor)
}
Spacer()
}
我想要实现的是,当单击前进按钮时,将加载一个新的URL。我认为问题是初始化var streamer = RadioStreamer()时会计算随机数,所以问题是..如何在按下前进按钮时再次调用RadioStreamer来随机化它?
有(至少)两种方法可以解决此问题。选项1与您拥有的RadioStreamer相同,并且在每次需要新播放器时都重新创建它。您必须将其设置为@State
变量才能执行此操作:
struct ContentView: View {
@State var streamer = RadioStreamer()
var body: some View {
Button(action: {
self.streamer.pauseStreaming()
self.streamer = RadioStreamer()
self.streamer.playStreaming()
}) {
Image(systemName: "forward.end").resizable()
.frame(width: 45, height: 45)
.aspectRatio(contentMode: .fit)
.foregroundColor(.buttonColor)
}
Spacer()
}
}
这样,旧的流光将暂停(如果正在播放),新的流光将被创建,从而触发init
选择随机元素的方法,然后开始使用。
第二个是创建RadioStreamer
一个类并对其进行修改,以便它可以更改其player
和playerItem
属性。请注意,它现在是一个类,而不是结构,因此它可以修改自己的属性而无需使用inout
class RadioStreamer {
var streamingURL: URL?
var radios = ["https://a", "https://b.mp3", "https://c.mp3", "d.mp3", "e.mp3"]
private var player: AVPlayer?
private var playerItem: AVPlayerItem?
public func createRandomPlayer() {
guard let streamingURL = URL (string:radios.randomElement()!) else {
assertionFailure("Invalid URL")
return
}
print(streamingURL)
self.playerItem = AVPlayerItem(url: streamingURL)
self.player = AVPlayer(playerItem: self.playerItem)
self.streamingURL = streamingURL
}
public func playStreaming() { self.player?.play() }
public func pauseStreaming() { self.player?.pause() }
}
struct ContentView: View {
var streamer = RadioStreamer()
var body: some View {
Button(action: {
self.streamer.pauseStreaming()
self.streamer.createRandomPlayer()
self.streamer.playStreaming()
}) {
Image(systemName: "forward.end").resizable()
.frame(width: 45, height: 45)
.aspectRatio(contentMode: .fit)
}
Spacer()
}
}
就我个人而言,我更喜欢第二种方法,还有另一种方法-我会做RadioStreamer
一个ObservableObject
并在其上放置一些@Published属性,这样isPlaying
我便可以在自己的观点中反映出来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句