2015-10-30 2 views
1

Я довольно новичок в понимании использования CoreLocation и Parse, поэтому, пожалуйста, несите меня! Я код с быстрым и много сообщений SO, которые я искал, были в Obc-C, с которыми я очень незнакома.Parse and Swift - PFGeoPoint с CLLocationManager?

............................................. ....................ОБНОВИТЬ............................. .......................................... Попытка хранения текущего местоположения пользователей в базу данных Parse, но она не работает. Я получаю ошибку:

[Ошибка]: недопустимый сессия лексем (Код: 209, Версия: 1.9.1) Необязательные (Ошибка Доменные = kCLErrorDomain Code = 0 "(нуль)")»

Любые предложения/помочь мне точку в правильном направлении?

import UIKit 
import Parse 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 

var manager: CLLocationManager! 
var activityIndicator:UIActivityIndicatorView = UIActivityIndicatorView() 

@IBOutlet weak var username: UITextField! 
@IBOutlet weak var password: UITextField! 

@IBAction func signUp(sender: AnyObject) { 

    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50)) 
    activityIndicator.center = self.view.center 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray 
    view.addSubview(activityIndicator) 
    activityIndicator.startAnimating() 
    UIApplication.sharedApplication().beginIgnoringInteractionEvents() 

    let user = PFUser() 
    user.username = username.text 
    user.password = password.text 

    user.signUpInBackgroundWithBlock { (success, error) -> Void in 
     self.activityIndicator.stopAnimating() 
     UIApplication.sharedApplication().endIgnoringInteractionEvents() 

     if error == nil { 

      PFGeoPoint.geoPointForCurrentLocationInBackground { (geoPoint: PFGeoPoint?, error: NSError?) -> Void in 
       if error == nil { 
        print("got location successfully") 
        PFUser.currentUser()!.setValue(geoPoint, forKey:"location") 
        PFUser.currentUser()!.saveInBackground() 

       } else { 
        print(error) 
       } 
      } 

      self.performSegueWithIdentifier("login", sender: self) 

     } else { 
      print(error) 
     } 
    } 
} 

@IBAction func login(sender: AnyObject) { 

    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50)) 
    activityIndicator.center = self.view.center 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray 
    view.addSubview(activityIndicator) 
    activityIndicator.startAnimating() 
    UIApplication.sharedApplication().beginIgnoringInteractionEvents() 

    PFUser.logInWithUsernameInBackground(username.text!, password: password.text!) { (success, error) -> Void in 
     if error == nil { 
      self.activityIndicator.stopAnimating() 
      UIApplication.sharedApplication().endIgnoringInteractionEvents() 
      self.performSegueWithIdentifier("login", sender: self) 
     } else { 
      print(error) 
     } 
    } 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    manager = CLLocationManager() 
    manager.delegate = self 
    manager.desiredAccuracy = kCLLocationAccuracyBest 
    manager.requestWhenInUseAuthorization() 
    manager.startUpdatingLocation() 

} 

ответ

2

Я бы рекомендовал хранить GeoPoint в пределах вашего User класса. Кроме того, вместо добавления GeoPoint к каждому Post, вы должны добавить указатель к User, кто его создал. Это устраняет избыточность хранения местоположения в два раза и гарантирует, что вам не нужно связываться с сохранением двух переменных в синхронизации. Кроме того, это также намного лучше, чем непосредственно хранить объект.

Обновите свой класс Post, указав колонку указателя User под названием user. Тогда вместо

postEvent["userId"] = PFUser.currentUser()!.objectId! 

Использование

postEvent["user"] = PFUser.currentUser()! 

Стоит также отметить, что Анализировать включает helper methods to get the current user's locations. Это так же просто, как следующий

PFGeoPoint.geoPointForCurrentLocationInBackground { 
    (geoPoint: PFGeoPoint?, error: NSError?) -> Void in 
    if error == nil { 
     // do something with the new geoPoint 
    } 
} 

Если вы решили справиться с CLLocationManager самостоятельно, убедитесь, что называть stopUpdatingLocation(), чтобы продлить срок службы батареи, как только вы обновили местоположение пользователя, при условии, что вам не нужно непрерывное обновление местоположения ,

Оттуда вы можете использовать query constraints и compound query, чтобы получить все из близлежащих Post объектов. В частности, вы захотите использовать whereKey: matchesQuery: как составной запрос, который считается только 1 запросом API.

// User's location 
let userGeoPoint = userObject["location"] as PFGeoPoint 

// Query nearby Users 
let nearbyUserQuery : PFQuery = PFUser.query() 
nearbyUserQuery.whereKey("location", nearGeoPoint:userGeoPoint) 

// Query Posts constrained to nearby Users 
let nearbyPostQuery : PFQuery = PFQuery(className: "Post") 

// Use a compound query to constrain the results to nearby Users 
nearbyPostQuery.whereKey("user", matchesQuery: nearbyUserQuery) 

// Limit the number of Posts if needed 
nearbyPostQuery.limit = 20 

nearbyPostQuery.findObjectsInBackgroundWithBlock { 
    (posts: [PFObject]?, error: NSError?) -> Void in 
    // Do something with the Posts 
} 
+0

Russell, большое спасибо за ваш ответ. У меня есть вопрос для вас, и я бы хотел получить ваши отзывы. Вы упомянули, что я должен хранить местоположение пользователей в классе User ... в моем приложении, я создал свой пользовательский класс во время фазы регистрации. Не могли бы вы посоветовать не хранить местоположение пользователей при регистрации? Или было бы более целесообразно ОБНОВИТЬ местоположение пользователей, когда пользователь просматривает «Подачу» и/или публикует изображение? – Matty

+0

Рад помочь! Я бы рекомендовал хранить/обновлять местоположение пользователя при каждом открытии приложения. Вы можете сделать все это в фоновом режиме, чтобы он никогда не мешал пользовательскому интерфейсу или ограничивался конкретными видами. – Russell

+0

Russell - Я создал новое приложение «dummy», чтобы практиковать шаги, которые вы предложили, но я попадаю в этот вспомогательный метод и сохраняю местоположение пользователей с помощью объекта PFUser. Не возражаете ли вы взглянуть на мой обновленный вопрос и соответствующий код? Еще раз, я ценю помощь! – Matty

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