質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

Q&A

解決済

1回答

543閲覧

SwiftのforEach内で、「URLSession.shared.dataTask〜」を一度ずつ実行したい

Shuichi_Ike

総合スコア10

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Google マップ

Google Mapは、Google社がオンラインで提供している地図・ローカル検索サービスです。GIS(Geographic Information System:地理情報システム)の中の「WebGIS」に該当します。地図・航空写真・地形の表示方式があり、それぞれユーザーが縮尺を調整して表示させることができます。地域の情報サービスを検索する機能やルート検索の機能も搭載されています。

0グッド

0クリップ

投稿2022/03/11 13:44

編集2022/03/11 13:58

前提・実現したいこと

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 }

ご教授いただけますと幸いです。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

別のシンプルな方法で現在地からの距離を算出することが出来、解決しました。

Swift

1//現在地の座標を取得 2let genzaiti:CLLocation = CLLocation(latitude: (self.currentLatitude)!, longitude: (self.currentLongitude)!) 3 4//目的地の座標を取得 5let mokutekiti:CLLocation = CLLocation(latitude: (car.carCurrentLatitude), longitude: (car.carCurrentLongitude)) 6 7//現在地〜目的地までの距離をdistanceDoubleへ格納。距離単位:m 8let distanceDouble = mokutekiti.distance(from: genzaiti)

投稿2022/03/11 16:02

編集2022/03/11 16:03
Shuichi_Ike

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問