Firebase SwiftUI map/array и как получить данные?

swiftui

#1

Всем привет, это моё первое сообщение сюда поэтому прошу не закидывать чем тут закидывают если что )
Вопрос банально прост - получение и запись данных Firebase. Всё было просто до момента работы с сущностью array и map
Имею следующую структуру данных в Firebase

имею вот такую модель:

struct CityList: Codable, Hashable {

var id: String = UUID().uuidString
var name: String
var latitude: String
var longitude: String

enum CodingKeys: String, CodingKey {
    case name
    case latitude
    case longitude
}

}

struct Cities: Codable, Identifiable {
    var id: String = UUID().uuidString
    var citiesList: [CityList]
}

И дальше самое интересное - пробую получить данные:

class WeatherList: ObservableObject {

    @Published var cities = [CityList]()

    func fetchCities(userInfo: UserInfo) {

        self.cities.removeAll()

        let db = Firestore.firestore()
            .collection("cities")
            .document(userInfo.user.uid)
   
        db.getDocument() { (document, error) in
            
            if let document = document, document.exists {
                
                guard let itemIDs = document.get("citiesList")
                
                else {
                    return
                }
                
                for i in itemIDs {
                    print(i.value)
                }
                
            } else { return }
        }
    }
}

Вопрос - каким правильным способом мне получить данные массива словарей из Firebase?

И следующий вопрос - добавлять данные как? Вернее делать апдейт массива - просто добавить данные получается, но updateData и setData по сути просто перезаписывают массив. а не аппендят

PS вариант №2

db.getDocument() { doc, error in
    
    if error == nil {
        
        let dataDoc = doc?.data()?.values
        
        print(dataDoc)
        
    }
    
}

выводит
Optional(Dictionary.Values([<__NSArrayM 0x600002b967f0>(
{
latitude = 12345;
longitude = 67890;
name = LA;
}
)
]))

а отладка на привет выводит следующее
dataDoc [String : Any].Values? some
_variant [String : Any]._Variant
object _BridgeStorage<__RawDictionaryStorage>
rawValue _DictionaryStorage<String, Any> 1 key/value pair 0x0000600003c51970
[0] (key: String, value: Any)
key String “citiesList”
_guts _StringGuts
value AnyObject
object NSMutableArray 1 element 0x0000600000584f90
[0] __NSDictionaryM * 3 key/value pairs 0x0000600000b88820
[0] (null) “name” : “LA”
[1] (null) “longitude” : “67890”
[2] (null) “latitude” : “12345”

как это счастье получить ума не приложу - второй день бьюсь - прошу помощи


#2

давно в 2018 я ковырял файрсторе - поищите в поиске.
Если вам надо обновить вложенные данные (словарь в словаре - у вас вроде так и получается: у ситиес есть набор 0,1… у в нем словари), то тогда они хранились неочевидно - через точку.

.updateData(["firstLevelKey.secondLevelKey" : newValue]

ну и апдейт дата по одному ключу обновляет только данный ключ, а не все значения вроде… хотя может чего и поменялось

Сейчас как - хз

Вообще я тогда все ответы нашёл в официальных примерах. Файрбейз на моей памяти лучший сервис по документации - у них описано вообще всё, не то что у Эппл ))) Посмотрите именно примеры проектов, в доках есть ссылки на них, там много полезного.