#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. Да, я удалил его, и все равно никакой разницы: ( Хотя спасибо за совет!