2017-01-10 5 views
0

На моей главной странице CollectionView (домашняя страница приложения) я хотел бы обновить местоположения (то есть сами ячейки) на основе ближайшего местоположения к пользователю. Я сохраняю свои местоположения в Firebase и будет использовать GeoFire и местоположение ядра, чтобы правильно перечислять местоположения в дистанционном порядке от пользователя.Загрузка данных о местоположении пользователя для запроса GeoFire в viewWillAppear

Другие сообщения говорят о том, что наилучшая практика для наблюдателей включает в себя загрузку в viewWillAppear;, однако я не смог получить местоположение пользователя до этого запуска и не имел центрированной точки для моего запроса GeoFire. В большинстве примеров, связанных с CoreLocation, используются карты или предварительно выбранные координаты, но я не планировал использовать карту внутри этого контроллера и хочу динамически загружать на основе местоположения пользователя.

Я исследовал загрузку didUpdateLocations в пределах AppDelegate, но так и не смог назвать этот метод. Каков наилучший способ получить координаты местоположения пользователя перед запуском запроса GeoFire при загрузке возвращаемых данных в viewWillAppear или вам нужно установить регион и проверить, введен ли пользователь в этот регион?

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

Как бы вы получили местоположение от Core Location в viewWillAppear? Должен ли я использовать метод диспетчера местоположений .requestLocation? не могли бы вы показать мне базовый код того, как вы преодолели эту проблему? – Josh

ответ

0

Существует довольно много не хватает в вашем коде, но вкратце (что работает для меня):

.requestLocation в viewWillAppear

.startUpdatingLocation() в viewDidAppear. (так дважды).

var justStartedUsingMap = true 

В didUpdateLocations:

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-the-following-observe-in-swift] как правильно удалить ручку для GeoFire в Swift 3, поскольку документация, похоже, не обновляется. Когда вы используете 'locationManager.location', это только вытягивание координат? – Josh

+0

@Josh Нет, он будет продолжать тянуть координаты, поэтому я помещаю в var justStartedUsingMap = true и put if justStartedUsingMap = true {if self.locationsIndex == 0 // etc justStartedUsingMap = false} else {locationManager.stopUpdatingLocation()} , стесняйтесь поставить это в ответ, поскольку я где-то читал, вы не должны этого делать. Также да ответ Джей удаляет ручку, но как только вы перемещаетесь по карте, и наблюдателю нужно найти новые объекты поблизости, наблюдатель не будет выпущен в viewDidDisappear. Я сузил это до наблюдателя. –

+0

Да, моя главная проблема сейчас в том, что иногда, и я не уверен, почему местоположение возвращается один раз много раз, а затем вызывает дублирование моего интерфейса при возврате на этот контроллер представления. Как вы думаете, я должен условно проверить, равен ли мой локальный массив определенному счету, а если не удалять старые значения местоположения? – Josh

Смежные вопросы