Как передать массив данных в JSON-запрос Swift

#json #swift #google-maps #geocoding

#json #Swift #Google-карты #Геокодирование

Вопрос:

Я пытаюсь получить информацию из моментального снимка Firebase каждого дочернего элемента в определенной ветви базы данных и передать ее в функцию, которая использует запрос API Google. Однако вместо того, чтобы передавать одну партию информации, завершать функцию, а затем делать то же самое для следующей партии информации, вместо этого передается вся информация сразу. Это приводит к тому, что URL-адрес получает только один адрес вместо всех. Я тоже получаю сообщение об ошибке «Фатальная ошибка: индекс вне диапазона: файл Swift / ContiguousArrayBuffer.swift, строка 444».

Код для получения моментального снимка:

 func fetchSalonsForMarkers() {

let ref = Database.database().reference()
    
    let _ = ref.child("user_profile").observeSingleEvent(of: .value, with: { (snapshot) in
        for child in snapshot.value as! [String : AnyObject] {
            
            let snapshotChildData = child.value as! [String : AnyObject]
            var uniqueSalonData = Salon()
            
            for (key, value) in snapshotChildData {
                uniqueSalonData.acceptedTerms = snapshotChildData["acceptedterms"] as? String
                uniqueSalonData.acceptedTermsModdifiedAt = snapshotChildData["acceptedtermsmoddifiedat"] as? String
                uniqueSalonData.businessName = snapshotChildData["businessname"] as? String
                uniqueSalonData.companyAddressCounty = snapshotChildData["companyaddresscounty"] as? String
                uniqueSalonData.companyAddressPostCode = snapshotChildData["companyaddresspostcode"] as? String
                uniqueSalonData.companyAddressStreet = snapshotChildData["companyaddressstreet"] as? String
                uniqueSalonData.companyAddressTown = snapshotChildData["companyaddresstown"] as? String
                uniqueSalonData.companyEmail = snapshotChildData["companyemail"] as? String
                uniqueSalonData.companyMobilePhone = snapshotChildData["companymobilephone"] as? Int
                uniqueSalonData.ownerFirstName = snapshotChildData["ownerFirstName"] as? String
                uniqueSalonData.ownerLastName = snapshotChildData["ownerLastName"] as? String
                uniqueSalonData.stripeCustomerId = snapshotChildData["stripeCustomerId"] as? String
            }
            self.salons.append(uniqueSalonData)
            self.longLatLookUp(street: uniqueSalonData.companyAddressStreet ?? "Street Error", town: uniqueSalonData.companyAddressTown ?? "Town Error", county: uniqueSalonData.companyAddressCounty ?? "County Error", postcode: uniqueSalonData.companyAddressPostCode ?? "Postcode Error", businessName: uniqueSalonData.businessName ?? "Name Error")
        }
    })
}
 

Код для вызова API (геокодирование Google)

  func longLatLookUp(street: String, town : String, county: String, postcode: String, businessName: String) {
        
        let completeSalonAddress = ("(street) (county) Scotland")
        let formattedSalonAddress = completeSalonAddress.replacingOccurrences(of: " ", with: "")

        let url = URL(string: "https://maps.googleapis.com/maps/api/geocode/json?address=(formattedSalonAddress)amp;key=APIKEY")!
       //API Key does have valid key.

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            let json = try? JSONDecoder().decode(Welcome.self, from: data)
            let salonLat = json?.results[0].geometry.location.lat
            let salonLng = json?.results[0].geometry.location.lng
            self.addMarkers(lat: salonLat!, lng: salonLng!, businessName: businessName)
        }
        task.resume()
    }
 

Код для добавления маркеров (для контекста):

 func addMarkers(lat: Double, lng: Double, businessName: String) {
    DispatchQueue.main.async {
        let marker = GMSMarker()
        marker.position = CLLocationCoordinate2D(latitude: lat , longitude: lng)
        marker.title = businessName
        marker.snippet = "Test"
        marker.appearAnimation = GMSMarkerAnimation.pop
        let markerPic: UIImage = UIImage(named: "AppIcon")!
        marker.icon = markerPic
        marker.map = self.mapView
    }
}
 

Комментарии:

1. Возможно, это не связано, но for (key, value)... цикл бессмыслен.

2. Да, я удалил его, и все равно никакой разницы: ( Хотя спасибо за совет!