2017-01-10 12 views
0

私のメインCollectionView(アプリケーションのホームページ)に、ユーザーに最も近い場所に基づいて場所(つまりセル自体)を更新したいと考えています。私は自分の場所をFirebaseに保存しており、ユーザーからの距離順に位置を正しく一覧表示するためにGeoFireとコアの場所を使用しています。GeoFireクエリのユーザー位置データをviewWillAppearに読み込む

他の投稿は、viewWillAppear;にロードすることをお勧めしますが、これが実行される前にユーザーの場所を取得することができず、GeoFireクエリの中心点がありません。 CoreLocationに関連するほとんどの例は、マップまたは事前選択座標を含んでいますが、このコントローラー内でマップを使用する予定はなく、ユーザーの位置に基づいて動的にロードする必要があります。

didUpdateLocationsAppDelegateの中で調査しましたが、そのメソッドを呼び出すことはできませんでした。返されたデータをviewWillAppearにロードするときにGeoFireクエリを実行する前にユーザーの場所の座標を取得する最善の方法は何ですか、または領域を設定してその領域内にユーザーが入力したかどうかを確認する必要がありますか?

var locationDict = [CLLocation]() //using this variable to pass values outside the function to the query   
    override func viewWillAppear(animated: Bool) { 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.requestAlwaysAuthorization() 
     locationManager.startUpdatingLocation() 
    } 


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let recentLocation = locations[0] 
    locationDict.append(recentLocation)  
    } 

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 

     print(error.localizedDescription) 

} 
+0

私は同じ問題を抱えていた、viewWillAppear&viewDidAppearでの観測で位置を取得することによってそれを解決しました。また、firebaseを照会する前に自分の場所が有効かどうかを確認しました。 –

+0

viewWillAppear自体のコア位置からどのように位置を取得しますか? .requestLocationのロケーションマネージャメソッドを使用する必要がありますか?あなたはその問題をどのように克服したかの基本的なコードを私に見せてくれますか? – Josh

答えて

0

あり、あなたのコード内で欠落しているかなり多くがあるが、短期的に(何が私のために動作します):viewWillAppear

.requestLocation

.startUpdatingLocationは()viewDidAppearで。 (2回)。 didUpdateLocationsで

var justStartedUsingMap = true 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){ 

    guard let myLocation:CLLocation = manager.location else {return} 
    let location:CLLocationCoordinate2D = myLocation.coordinate 
    let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.12, longitudeDelta: 0.12)) 

    if justStartedUsingMap == true { 
     self.currentLocationSearch(myLocation) 
     justStartedUsingMap = false 
    } else { 
     locationManager.stopUpdatingLocation() 
    } 

    self.map.setRegion(region, animated: true) 
} 

func currentLocationSearch(_ location: CLLocation) { 
    // the geofire observer 
} 
+0

この[http://stackoverflow.com/questions/41449938/how-to-remove-a-geofire-handle-for-thefollowing-observe-in-swift]に関するご質問から、ハンドルを適切に削除するにはどうすればよいですかドキュメンテーションが更新されていないため、Swift 3のGeoFire用です。 'locationManager.location'を使用すると、座標は一度だけ引っ張られますか? – Josh

+0

@Joshいいえ、私はvar justStartedUsingMap = trueを入れて、justStartedUsingMap = true {if self.locationsIndex == 0 // etc justStartedUsingMap = false} else {locationManager.stopUpdatingLocation()}を配置します。私はあなたがそれをしてはならないどこかを読んで、答えにそれを入れるのをためらっています。また、ジェイによる答えはハンドルを削除しますが、マップ上を移動してオブザーバーが近くに新しいオブジェクトを見つける必要があるとすぐに、オブザーバーはviewDidDisappearで解放されません。私はそれを観察者に絞った。 –

+0

ええ、私の主な問題は、時々、場所が何度も何度返されたのか不明で、このView Controllerに戻るときにUIが重複してしまうことです。私のローカル配列が特定の数と等しいかどうかを条件付きでチェックし、古い位置の値を削除しないかどうかを確認する必要があると思いますか? – Josh

関連する問題