2015-05-29 2 views
0
let locationManager = CLLocationManager() 

@IBOutlet var map: MKMapView! 

func getLocation()-> CLLocation! { 
    self.locationManager.startUpdatingLocation() 
    sleep(1) 
    self.locationManager.stopUpdatingLocation() 
    var x = locationManager.location 
    return x 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    self.locationManager.requestWhenInUseAuthorization() 

    var mapCoord:CLLocation! = getLocation() 
    var mapLat:Double! = mapCoord.coordinate.latitude //Where the thread error is 
    var mapLong:Double! = mapCoord.coordinate.longitude 
//Setup of the rest of the map is completed 

Мой код, как указано выше, в Swift. Я получаю сообщение об ошибке:Обновление Текущий Местоположение

thread error of an unexpected nil value

при вызове для координат от функции getLocation(). Я изменил и mapLat, и mapLong, чтобы проверить, что вызывает нуль. Мое приложение будет загружаться, но я получаю сообщение на выходе, что мое текущее местоположение не может быть обновлено, поскольку я не просил разрешения; однако у меня есть функция запросить разрешение в начале моего viewDiDLoad(). Я использовал этот формат раньше в другом проекте, и он сработал, поэтому я знаю, что мне не хватает чего-то очевидного и т. Д. Спасибо за любую помощь.

ответ

1

Ваш код является очень неправильным и не будет работать.

Вы не можете написать процедурный код, который начинает обновление местоположения, приостанавливает, останавливает обновления местоположения, а затем получает местоположение.

Вы должны настроить себя как делегата менеджера местоположения, начать обновление местоположения и вернуться.

В некоторый момент после этого система вызовет ваш метод locationManager:didUpdateLocations.

Для этого вам необходимо проверить точность местонахождения и убедиться, что она достаточно точна. (Часто первые несколько показаний местоположения, которые вы получаете при первом включении GPS, довольно плохие и не соответствуют вашей желаемой точности. Я предлагаю горизонтальную точность 200 М или около того, в зависимости от требований вашего приложения.

Если вы достаточно точно читаете, вы можете отключить обновления и использовать это место для своих нужд.

PS Никогда, никогда, никогда не используйте функцию sleep() на основной теме. Фактически, в качестве новичка iOS Mac OS разработчик, вы должны притворяться, что функции сна не существует.

0

Попробуйте это. Вам нужно будет запросить разрешение и только когда у вас есть допустимые разрешения, вы можете начать обновление.

typealias Location = CLLocation 

//MARK: Private Variables 
private let locationManager = CLLocationManager() 
private var currentLocation: Location? { 
    didSet { 
     // You have a new location. Use it somehow 
    } 
} 

//MARK: View Lifecycle 
override func viewDidLoad() { 
    super.viewDidLoad() 

    locationManager.delegate = self 
} 

override func viewWillAppear(animated: Bool) { 
    // Ask for permission if necessary 
    let currentStatus = CLLocationManager.authorizationStatus() 
    if currentStatus == .Restricted || currentStatus == .Denied || currentStatus == .NotDetermined { 
     locationManager.requestWhenInUseAuthorization() 
    } else { 
     locationManager.startUpdatingLocation() 
    } 
} 

//MARK: CLLocationManagerDelegate 
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if status == .AuthorizedWhenInUse { 
     locationManager.startUpdatingLocation() 
    } 
} 

func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) { 
    newLocation 
    currentLocation = newLocation 
    locationManager.stopUpdatingLocation() 
}