GoogleMaps iOS SDK Класс GMSMapView освобожден

Я работаю над интеграцией SDK GoogleMaps для iOS в свой проект и продолжаю получать эту ошибку:

'NSInternalInconsistencyException' 'Экземпляр 0x7fea5e93e210 класса GMSMapView был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы с ним. Текущая информация наблюдения:

Вот мой код контроллера представления:

import UIKit
import GoogleMaps

class ViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate {

var locationManager = CLLocationManager()

var didFindMyLocation = false

let mapView = GMSMapView()

override func viewDidLoad() {
    super.viewDidLoad()

    let mapView = GMSMapView()


    locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()

    let camera: GMSCameraPosition = GMSCameraPosition.cameraWithLatitude(37.61729,longitude: -122.38229, zoom: 18)

    mapView.camera = camera

    mapView.delegate = self

    mapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    if !didFindMyLocation {
        let myLocation: CLLocation = change![NSKeyValueChangeNewKey] as! CLLocation
        mapView.camera = GMSCameraPosition.cameraWithTarget(myLocation.coordinate, zoom: 18.0)
        mapView.settings.myLocationButton = true

           didFindMyLocation = true
        }
    }

}

person Ryan Diew    schedule 22.06.2016    source источник


Ответы (2)


Как говорится: «наблюдатели ключевых значений все еще были зарегистрированы с ним», что, по сути, жалуется на то, что вы не отменили регистрацию наблюдателя KVO.

KVO в этом смысле похож на NSNotification — если вы зарегистрировали наблюдателя, скажем, в viewDidLoad:, вам нужно удалить наблюдателя, скажем, в viewDidDisappear: или dealloc.

В вашем случае попробуйте добавить функцию dealloc и использовать removeObserver:forKeyPath:context: для отписки от KVO. Подробнее читайте в статье Мэтта для KVO здесь.

person Stephenye    schedule 22.06.2016

Свифт 3

deinit {
            mapView.removeObserver(self, forKeyPath: "myLocation")
}
person Sourabh Sharma    schedule 08.10.2016