前提・実現したいこと
GoogleMapを使用しているiOSアプリで、「Firebase上の位置情報(緯度・経度)」と「現在地からの距離」を紐づけたい(現在地から近い順にCollectionView上で並べるため)
発生している問題
forEach文でFirebase上の位置情報(緯度経度)を一つずつ取り出し、その中で「URLSession.shared.dataTask〜」を実行し現在地からの距離を算出したところ、forEach文が全て処理されてから「URLSession.shared.dataTask〜」が実行されてしまいます。
そのため、forEach文で取り出した値(car)に「URLSession.shared.dataTask〜」で計算した「現在地からの距離(miles)」を紐づけることが出来ません。
(ソースコードを実行すると、コンソールには「外外外外中中中中」と表示されるますが、本来は「外中外中外中外中」と表示されてほしいです)
該当のソースコード
Swift
1import UIKit 2import Firebase 3import GoogleMaps 4import CoreLocation 5~~~~ 6 var cars = [Car]() 7 fileprivate func fetchCars() { 8 9 let ref = Database.database().reference().child("Cars") 10 ref.observeSingleEvent(of: .value, with: { (snapshot) in 11 guard let dictionaries = snapshot.value as? [String: Any] else { 12 return 13 } 14 15 dictionaries.forEach({ (key, value) in 16 guard let dictionary = value as? [String: Any] else 17 { return } 18 let car = Car(dictionary: dictionary) 19 20 let origin = "\(Double(self.currentLatitude!)),\(Double(self.currentLongitude!))" 21 let destination = "\(Double(car.carCurrentLatitude)),\(Double(car.carCurrentLongitude))" 22 23 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)" 24 let url = URL(string: urlString) 25 26 print("外") 27 28 URLSession.shared.dataTask(with: url!, completionHandler: { 29 (data, response, error) in 30 if(error != nil){ 31 print("error") 32 }else{ 33 do{ 34 let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String: AnyObject] 35 let rows = json["rows"] as! NSArray 36 37 let dic = rows[0] as! Dictionary<String, Any> 38 let elements = dic["elements"] as! NSArray 39 let dis = elements[0] as! Dictionary<String, Any> 40 let distanceMiles = dis["distance"] as! Dictionary<String, Any> 41 var miles = distanceMiles["text"]! as! String 42 car.carDistance = miles 43 print("中") 44 } catch let error as NSError{ 45 print("error:\(error)") 46 } 47 } 48 }).resume() 49 self.cars.append(car) 50 }) 51 self.carCollection.reloadData() 52 }) { (err) in 53 print("Failed to fetch cars", err) 54 } 55 }
ご教授いただけますと幸いです。
何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。