Swift 如何显示Firebase中已排序的地图
我正在制作音频流应用程序。我已经制作了一张专辑列表,每个专辑都附有歌曲。我可以按“排序依据”功能对这些专辑进行排序,但我不知道如何对歌曲数组进行排序。在firebase中,我制作了一个名为Album的主要集合,在这个集合中我制作了几个字符串文件,其中一个是名为song的地图,它由另外几个字符串文件组成。我的问题是我不能在swiftui项目中对歌曲进行排序 这是音频数据代码:Swift 如何显示Firebase中已排序的地图,swift,firebase,google-cloud-firestore,swiftui,Swift,Firebase,Google Cloud Firestore,Swiftui,我正在制作音频流应用程序。我已经制作了一张专辑列表,每个专辑都附有歌曲。我可以按“排序依据”功能对这些专辑进行排序,但我不知道如何对歌曲数组进行排序。在firebase中,我制作了一个名为Album的主要集合,在这个集合中我制作了几个字符串文件,其中一个是名为song的地图,它由另外几个字符串文件组成。我的问题是我不能在swiftui项目中对歌曲进行排序 这是音频数据代码: import Foundation import SwiftUI import FirebaseFirestore imp
import Foundation
import SwiftUI
import FirebaseFirestore
import Firebase
class OurData: ObservableObject {
@Published public var albums = [Album]()
func loadAlbums() {
Firestore.firestore().collection("Album").order(by: "songs", descending: true)
Firestore.firestore().collection("Album").getDocuments { (snapshot, error) in
if error == nil {
for document in snapshot!.documents{
let name = document.data()["name"] as? String ?? "error"
let image = document.data()["image"] as? String ?? "1"
let songs = document.data()["songs"] as? [String : [String : Any]]
var songsArray = [Song]()
if let songs = songs{
for song in songs {
let songName = song.value["name"] as? String ?? "error"
let songTime = song.value["time"] as? String ?? "error"
let artistName = song.value["artistName"] as? String ?? "error"
let songFile = song.value["file"] as? String ?? "error"
songsArray.append(Song(songName: songName, image: image, time: songTime, artist: artistName, file: songFile))
}
}
self.albums.append(Album(albumName: name, image: image, song: songsArray))
}
}else{
print(error!)
}
}
}
以下是音频播放器代码:
import SwiftUI
struct Album : Hashable {
var ID = UUID()
var albumName : String
var image : String
var song : [Song]
}
struct Song: Hashable {
var ID = UUID()
var songName : String
var image : String
var time : String
var artist : String
var file : String
}
struct PodcastView : View {
@ObservedObject var data: OurData
@State private var currentAlbum : Album?
var body: some View {
VStack{
ScrollView (.horizontal, showsIndicators: false, content: {
LazyHStack{
ForEach(self.data.albums, id: \.self, content: {
album in
AlbumView(album: album).onTapGesture {
self.currentAlbum = album
}
})
}
})
ScrollView{
LazyVStack{
if self.data.albums.first == nil {
EmptyView()
}else{
ForEach((self.currentAlbum?.song ?? self.data.albums.first?.song) ?? [Song(songName: "", image: "", time: "", artist: "", file: "")],
id: \.self,
content: {
song in
SongCell(album: currentAlbum ?? self.data.albums.first!, song: song)
})
}
}
}
.navigationTitle("Podcasty")
.foregroundColor(.black)
}
}
}
struct AlbumView : View{
var album : Album
var body: some View{
ZStack (alignment: .bottom, content: {
Image(album.image)
.resizable()
.aspectRatio(contentMode: .fill)
ZStack{
Blur(style: .extraLight)
Text(album.albumName)
.foregroundColor(.black)
}.frame(height: 60, alignment: .center)
}).frame(width: 200, height: 200, alignment: .center)
.cornerRadius(15.0)
.shadow(radius: 10)
.padding(15)
}
}
struct SongCell : View {
@State var showPlayer = false
var album : Album
var song : Song
var body: some View {
Button(action: {
self.showPlayer.toggle()
}){
HStack{
Image(song.image)
.resizable()
.frame(width: 100, height: 100)
.cornerRadius(15)
.padding()
VStack{
Text(song.songName)
.fontWeight(.semibold)
.font(.system(size: 18))
Text(song.artist)
.font(.system(size: 16))
}
Spacer()
Text(song.time)
.padding(.trailing, 10)
}.frame(width: 380, height: 120, alignment: .trailing)
.background(
ZStack {
RoundedRectangle(cornerRadius: 25)
.fill(Color.white)
.shadow(color: Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)), radius: 5, x: 0, y: 5)
})
.padding(10)
}.sheet(isPresented: $showPlayer, content: {
PodcastPlayerView(album: album, song: song)
})
}
}
这是我的Firebase专辑和歌曲数据的屏幕截图链接:
您需要在问题中添加
歌曲
和专辑
类型的定义。在我看来,你有一个专辑结构数组,每个专辑结构包含一个歌曲结构数组。使用map语句重建唱片集数组以包含按特定顺序排序的歌曲非常简单,但如果不查看数据结构,我无法指导您如何执行此操作。好的,那么您希望我发送什么,Firebase的数据结构?将您的Swift歌曲
和专辑
结构添加到您的问题中。很抱歉再次询问,但我是新手,我仍然不确定您想从我这里得到什么。我的意思是,我的问题中几乎添加了所有内容。别生我的气,但说真的,我不知道你在问什么,我以为专辑和歌曲的结构都附加到音频播放器代码上了:/你可以从Firebase控制台得到这个。基本上,您的数据是如何组织的。