Swift 5 / Swift UI中的随机URL

恶魔

我正在尝试使用以下结构播放随机广播电台:

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来随机化它?

jnpdx

有(至少)两种方法可以解决此问题。选项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一个类并对其进行修改,以便它可以更改其playerplayerItem属性。请注意,它现在是一个类,而不是结构,因此它可以修改自己的属性而无需使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift 5中的XOR?

来自分类Dev

Swift中的随机值

来自分类Dev

Swift中的随机值

来自分类Dev

Swift中的PKCS#5填充

来自分类Dev

Swift Beta 5中的bridgeToObjectiveC和makeObjectsPerformSelector

来自分类Dev

如何确定Swift 5中的拖放位置?

来自分类Dev

在Swift5中获取环境类型

来自分类Dev

在Swift 5中更新JSON数组

来自分类Dev

如何在Swift 5中遍历字典?

来自分类Dev

Swift 5中引用分配是原子的吗?

来自分类Dev

在 Swift 5 中遇到 while 循环问题

来自分类Dev

Swift UI:使用数组中的随机元素更新视图

来自分类Dev

在Swift中创建随机布尔

来自分类Dev

在Swift中缩短URL

来自分类Dev

如何使用Swift 5从相册获得图像的URL

来自分类Dev

Swift WebView 未加载 url html5 游戏内容

来自分类Dev

Swift 5中的用户无法访问UITableViewCell中的MKMapView

来自分类Dev

在Swift 5中从数组中删除特定索引处的对象

来自分类Dev

在Swift 5中的通用方法中解开可选类型

来自分类Dev

如何从 Swift 5 中的数组中删除重复元素?

来自分类Dev

Swift5 @dynamicMemberLookup函数

来自分类Dev

Swift 5:解码嵌套JSON

来自分类Dev

解析无效的JSON Swift 5

来自分类Dev

Swift 5动态数组类型

来自分类Dev

Swift 5 - 导航页面

来自分类Dev

Swift中的协议声明-Xcode 6 beta 5

来自分类Dev

Swift Beta 5中的字符串到浮点转换

来自分类Dev

如何在Swift 5结果中处理空响应

来自分类Dev

如何在Swift 5中正确使用子类