Как я могу получить текущее местоположение пользователя, выполнить локальный гео-запрос и затем применить результаты к PFQueryTableViewController?
Я работал над следующим кодом и запутался! Идея этого фрагмента кода состоит в том, чтобы захватить текущее местоположение пользователя, выполнить поиск точек в радиусе 10 км, а затем вывести их через PFQueryTableView.
Мой код состоит из двух частей из-за моей путаницы. Первая часть возвращает количество результатов, которые я ожидаю, так как оператор println для подсчета объектов отражает, что он находит 1 элемент для текущего местоположения GPS, которое я настроил с помощью инструментов отладки симулятора.
Затем вторая часть функции выполняет аналогичный запрос на основе фиксированного местоположения, но я не хочу, чтобы он работал.
В идеале, если бы я мог сделать это, используя только блок geoPointForCurrentLocationInBackground, было бы здорово.
Вопрос в том, как мне заставить это работать? Я нахожусь в процессе изучения Swift и разработки для IOS, пришедших из другой среды разработки.
override func queryForTable() -> PFQuery! {
PFGeoPoint.geoPointForCurrentLocationInBackground {
(point:PFGeoPoint!, error:NSError!) -> Void in
if error == nil {
var query = PFQuery(className: "Town")
query.limit = 10
query.whereKey("gps", nearGeoPoint: point, withinKilometers: 10.0)
query.findObjectsInBackgroundWithBlock{
(objects: [AnyObject]!, error: NSError!) -> Void in
if (error == nil) {
println(objects.count)
}
}
}
}
let userGeoPoint = PFGeoPoint(latitude:40.0, longitude:-30.0)
var query = PFQuery(className:"Town")
// Interested in locations near user.
query.whereKey("gps", nearGeoPoint:userGeoPoint, withinKilometers: 5.0)
// Limit what could be a lot of points.
query.limit = 10
// Final list of objects
//let placesObjects = query2.findObjects()
return query
}
1 ответ
Проблема, с которой вы столкнулись, заключается в том, что определение местоположения пользователей происходит асинхронно, но вам необходимо синхронно возвращать запрос из этого метода (так что, скорее всего, ваш метод вернет запрос до того, как у вас будет местоположение пользователя). Я бы посоветовал вам реструктурировать свой код, чтобы сделать пару вещей.
- Получить местоположение пользователей раньше, как в
viewDidLoad()
, или жеview[Will/Did]Appear()
и перезагрузите tableView, когда у вас есть местоположение. - Верните запрос, который дает 0 результатов (или использует местоположение по умолчанию, или игнорирует местоположение), если вы не знаете местоположение пользователей. Соответствующее поведение здесь зависит от приложения.
Итак, вам нужно что-то вроде ниже.
class MyViewController: PFQueryTableViewController {
var usersLocation: PFGeoPoint? {
didSet {
// This will reload the tableview when you set the users location.
// Handy if you want to keep updating it.
if (tableView != nil) {
tableView.reloadData()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
PFGeoPoint.geoPointForCurrentLocationInBackground { point, error in
if error == nil {
self.usersLocation = point
}
}
}
override func queryForTable() -> PFQuery! {
var query = PFQuery(className:"Town")
// If we don't have a location, just query without it.
if let location = usersLocation {
query.whereKey("gps", nearGeoPoint:location, withinKilometers: 5.0)
}
query.limit = 10
return query
}
}