前提・実現したいこと
GoogleMapを使用しているiOSアプリで、「Firebase上の位置情報(緯度・経度)」と「現在地からの距離」を紐づけたい(現在地から近い順にCollectionView上で並べるため)
発生している問題
forEach文でFirebase上の位置情報(緯度経度)を一つずつ取り出し、その中で「URLSession.shared.dataTask〜」を実行し現在地からの距離を算出したところ、forEach文が全て処理されてから「URLSession.shared.dataTask〜」が実行されてしまいます。
そのため、forEach文で取り出した値(car)に「URLSession.shared.dataTask〜」で計算した「現在地からの距離(miles)」を紐づけることが出来ません。
(ソースコードを実行すると、コンソールには「外外外外中中中中」と表示されるますが、本来は「外中外中外中外中」と表示されてほしいです)
該当のソースコード
Swift
import UIKit import Firebase import GoogleMaps import CoreLocation ~~~~ var cars = [Car]() fileprivate func fetchCars() { let ref = Database.database().reference().child("Cars") ref.observeSingleEvent(of: .value, with: { (snapshot) in guard let dictionaries = snapshot.value as? [String: Any] else { return } dictionaries.forEach({ (key, value) in guard let dictionary = value as? [String: Any] else { return } let car = Car(dictionary: dictionary) let origin = "\(Double(self.currentLatitude!)),\(Double(self.currentLongitude!))" let destination = "\(Double(car.carCurrentLatitude)),\(Double(car.carCurrentLongitude))" let urlString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=\(origin)&destinations=\(destination)&units=metric&mode=walking&language=en-EN&sensor=false&key=\(googleApiKey)" let url = URL(string: urlString) print("外") URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in if(error != nil){ print("error") }else{ do{ let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String: AnyObject] let rows = json["rows"] as! NSArray let dic = rows[0] as! Dictionary<String, Any> let elements = dic["elements"] as! NSArray let dis = elements[0] as! Dictionary<String, Any> let distanceMiles = dis["distance"] as! Dictionary<String, Any> var miles = distanceMiles["text"]! as! String car.carDistance = miles print("中") } catch let error as NSError{ print("error:\(error)") } } }).resume() self.cars.append(car) }) self.carCollection.reloadData() }) { (err) in print("Failed to fetch cars", err) } }
ご教授いただけますと幸いです。
何卒よろしくお願いいたします。
まだ回答がついていません
会員登録して回答してみよう