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

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

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

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

Swift

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

Google マップ

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

解決済

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

Shuichi_Ike
Shuichi_Ikehara

総合スコア10

Firebase

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

Swift

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

Google マップ

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

1回答

0評価

0クリップ

202閲覧

投稿2022/03/11 13:44

編集2022/03/12 01:03

前提・実現したいこと

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) } }

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Firebase

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

Swift

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

Google マップ

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