我如何获取用户的当前位置,执行本地地理查询,然后将结果应用到 PFQueryTableViewController?
How can I get the user's current location, perform a local geo query and then apply the results to a 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
}
你在这里遇到的问题是用户位置的确定是异步发生的,但你需要 return 从该方法同步查询(所以你的方法很可能会 return 在您拥有用户位置之前的查询)。我建议您重组代码以完成几件事。
- 更早获取用户位置,如
viewDidLoad()
或 view[Will/Did]Appear()
,并在获得位置后重新加载 tableView。
- Return 如果您不知道用户的位置,则查询给出 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
}
}
我一直在研究下面的代码,结果搞糊涂了!这段代码摘录的想法是获取用户的当前位置,搜索半径 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
}
你在这里遇到的问题是用户位置的确定是异步发生的,但你需要 return 从该方法同步查询(所以你的方法很可能会 return 在您拥有用户位置之前的查询)。我建议您重组代码以完成几件事。
- 更早获取用户位置,如
viewDidLoad()
或view[Will/Did]Appear()
,并在获得位置后重新加载 tableView。 - Return 如果您不知道用户的位置,则查询给出 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
}
}