Swift - Как записать сложные объекты в базу данных Firebase в реальном времени - PullRequest
1 голос
/ 01 мая 2020

Я новичок в базе данных Firebase реального времени и относительно новичок в Swift в целом. Я пытаюсь создать приложение для запроса песен, в котором пользователи могут создавать события для гостей, которые запрашивают песни из Spotify API. Я пытаюсь написать объект Event в Firebase, который содержит вложенные объекты и массивы разных типов. Тем не менее, когда он записывает в базу данных, он записывает только строки, а не массивы или объекты. Каков наилучший способ записать всю эту информацию в базу данных Firebase во вложенной структуре, чтобы всякий раз, когда пользователи добавляли запросы на песни, я мог редактировать массив запросов для данного события в firebase.

Вот мой код:

Event.swift

struct Event: Codable{
var code: String
var name: String
var host: String
var description: String
var hostUserId: String
var guestIds: [String]
var requests: [Request]
var queue: [Request]
var played: [Request]
//private var allowExplicit: Bool
//private var eventLocation

init(code: String, name: String, host: String, description: String, hostUserId: String){
    self.code = code
    self.name = name
    self.host = host
    self.description = description
    self.hostUserId = hostUserId
    self.guestIds = []
    self.requests = []
    self.queue = []
    self.played = []
}

func toAnyObject() -> Any{
    var guestIdsDict: [String:String] = [:]
    for id in guestIds{
        guestIdsDict[id] = id
    }

    var requestsDict: [String: Any] = [:]
    for request in requests{
        requestsDict[request.getId()] = request.toAnyObject()
    }

    var queueDict: [String: Any] = [:]
    for request in queue{
        queueDict[request.getId()] = request.toAnyObject()
    }

    var playedDict: [String: Any] = [:]
    for request in played{
        playedDict[request.getId()] = request.toAnyObject()
    }

    return [
        "code": code,
        "name": name,
        "host": host,
        "description": description,
        "hostUserId": hostUserId,
        "guestIds": guestIdsDict,
        "requests": requestsDict,
        "queue":queueDict,
        "played":playedDict
    ]
}

}

Request.swift

struct Request: Codable{
private var name: String
private var id: String
private var explicit: Bool
private var album: Album
private var artists: [Artist]
private var likes: Int

init(name: String, id: String, explicit: Bool, album: Album, artists: [Artist]){
    self.name = name
    self.id = id
    self.explicit = explicit
    self.album = album
    self.artists = artists
    self.likes = 1
}

func toAnyObject() -> Any{
    var artistsDict: [String:Any] = [:]
    for artist in artists {
        artistsDict[artist.id] = artist.toAnyObject()
    }
    return [
        "name": name,
        "id": id,
        "explicit": explicit,
        "album": album.toAnyObject(),
        "artists": artistsDict,
        "likes": likes
    ]
}

mutating func like(){
    self.likes += 1
}

mutating func unlike(){
    self.likes -= 1
    if(self.likes < 0){
        self.likes = 0
    }
}

mutating func setLikes(count: Int){
    self.likes = count
}

func getLikes() -> Int{
    return self.likes
}

func getName() -> String{
    return self.name
}

func getId() -> String{
    return self.id
}

func getExplicit() -> Bool{
    return self.explicit
}

func getAlbum() -> Album {
    return self.album
}

func getImages() -> [Image] {
    return self.album.images
}

func getArtists() -> [Artist] {
    return self.artists
}

func getArtistString() -> String{
    var artistString = ""
    for (i, artist) in self.artists.enumerated(){
        artistString += artist.name
        if(i != self.artists.endIndex-1){
            artistString += ", "
        }
    }
    return artistString
}

}

Album.swift

struct Album: Codable{
let name: String
let images: [Image]

func toAnyObject() -> Any{
    var imagesDict: [String: Any] = [:]
    for image in images{
        imagesDict[image.url] = image.toAnyObject()
    }
    return [
        "name": name,
        "images": imagesDict
    ]
}

}

Artist.swift

struct Artist: Codable{
let id: String
let name: String

func toAnyObject() -> Any{
    return ["id": id, "name": name]
}

}

Image.swift

struct Image: Codable{
let height: Int
let url: String
let width: Int

func toAnyObject() -> Any{
    return ["height": height, "url": url, "width": width]
}

}

1 Ответ

0 голосов
/ 01 мая 2020

Поскольку вы используете Codable, вы можете создать из него ди c следующим образом:

Шаг 1: Добавьте это расширение к своему коду

extension Encodable {
  var dictionary: [String: Any]? {
    guard let data = try? JSONEncoder().encode(self) else { return nil }
    return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
  }
}

Шаг 2: Напишите ниже код в вашей структуре (это вы должны сделать в каждой структуре, или вы можете изменить код в соответствии с вашими потребностями).

func createDic() -> [String: Any]? {
    guard let dic = self.dictionary else {
        return nil
    }

    return dic
}

Теперь с помощью struct obj вызовите createDi c () метод, и вы получите словарь.

И вы можете отправить этот словарь в пожарную базу.

Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы.

Рад помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...