Получение объектов на основе фильтра расстояний в Parse+Swift

Я довольно новичок в разработке IOS, и я практически не знаю, что означает эта ошибка. Ошибка появляется, когда я пытаюсь использовать Parse для получения объекта на расстоянии 1,0 км от пользователя.

PFGeoPoint.geoPointForCurrentLocationInBackground { (geoPoint: PFGeoPoint?, error: NSError?) -> Void in

    var query = PFQuery(className: "VenueData")
    query.whereKey(key: "Name", nearGeoPoint: geoPoint, withinKilometers: 1.0)

    var object = query.findObjects()
    println(object)
    }

Однако всякий раз, когда я использую ограничение в пределах километров, эта ошибка продолжает появляться, и я не знаю, почему это происходит. Любая помощь будет принята с благодарностью.

$nearSphere: работает только с полями геоточки (Код: 102, Версия: 1.7.4)


person bantukatanaya    schedule 28.07.2015    source источник


Ответы (2)


Я предполагаю, что это работает, потому что ваше поле Name, скорее всего, является строкой, а не полем PFGeoPoint. Если вы посмотрите в своем браузере данных на Parse, вы сможете определить это. PFGeoPoint должна быть широтой и долготой в браузере данных, чтобы это работало.

person pbush25    schedule 28.07.2015

Я бы не стал использовать withinKilometers. Вместо этого я бы использовал метод withinMiles. Использовать геоточки из Parse в Swift намного проще. Если вы все еще хотите использовать километры, просто конвертируйте километры в мили. В этом случае вместо:

withinKilometers: 1.0

использовать:

withinMiles: 0.62

Этот код ниже должен работать:

query.whereKey("Name", nearGeoPoint: geoPoint, withinMiles: 0.62)

Если приведенный выше код не работает:

попробуйте это, это код, который я использовал для отображения точек на карте, которые находятся в нескольких милях от текущего местоположения пользователя. Но вам нужно будет настроить некоторые вещи в файле info.plist, чтобы получить текущее местоположение пользователей. Вот пример кода, который вы можете попробовать.

import UIKit
import MapKit
import CoreLocation
import Parse
import ParseUI
import Bolts

var currentLoc: PFGeoPoint = PFGeoPoint()

class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!
    var query: PFQuery = PFQuery()
    var manager:CLLocationManager!

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(true)

        query = PFQuery(className: "ClassName")
        query.whereKey("dateOfClass", greaterThanOrEqualTo: NSDate())
        query.whereKey("classes", nearGeoPoint: currentLoc, withinMiles: 400)

        query.findObjectsInBackgroundWithBlock {
            (posts, error) -> Void in
            if error == nil {

                let myPosts = posts as! [PFObject]

                for post in myPosts {

                    var subtitleString: String = String()

                    if let dateObject = post["dateOfClass"] as? NSDate {

                        var dateFormatter = NSDateFormatter()
                        dateFormatter.dateFormat = "MM/dd/yyyy HH:mm a"
                        var dateNSDate: String = dateFormatter.stringFromDate(dateObject)
                        subtitleString = dateNSDate

                    }

                    let point = post["classes"] as! PFGeoPoint

                    var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: point.latitude, longitude: point.longitude)
                    var workoutClassName: String = post.objectForKey("workoutClassName") as! String
                    var workoutClassInstructor: String = post.objectForKey("instructorName") as! String
                    var objectsID: String = post.objectId! as String
                    var annotation: MapPin = MapPin(coordinate: coordinate, title: "\(workoutClassName), \(workoutClassInstructor)", subtitle: "\(subtitleString)", annotationID: "\(objectsID)")
                    self.mapView.addAnnotation(annotation)

                }
            } else {
                // Log details of the failure
                println("Error: \(error)")
            }
        }

        println(currentLoc)

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.showsUserLocation = true

        var latitude: CLLocationDegrees = currentLoc.latitude

        var longitude: CLLocationDegrees = currentLoc.longitude

        var latDelta:CLLocationDegrees = 0.7

        var lonDelta:CLLocationDegrees = 0.7

        var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)

        var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)

        var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)

        mapView.setRegion(region, animated: false)

    }

}
person Stefan DeClerck    schedule 28.07.2015