iOS Swift: Google 地图和 MapKit 访问使内存使用量翻倍
iOS Swift: Google Maps and MapKit access doubles memory usage
我的目标是:在用户使用我的应用程序时智能地管理用户 phone 内存和电池使用情况。
我正在 iOS 应用程序中使用 MapKit 和 Google 地图。最初启动该应用程序时,我要求获得访问该位置的授权(稍后我将在该应用程序中使用)。
我使用地图的第一个地方是在获取路线时。
授权码如下:
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.AuthorizedWhenInUse {
viewMap.myLocationEnabled = true
} else if status == CLAuthorizationStatus.NotDetermined {
println("Location disabled")
viewMap.myLocationEnabled = false
}
}
我使用地图的第二个地方是检索在我第一次访问地图期间在特定位置创建的一些数据。基本上只是当前位置如下。
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
startLocation = nil
获得位置后,我将其称为:
locationManager.stopUpdatingLocation()
问题是:应用程序一启动,我就可以看到标志(状态栏中的小三角形)表明 GPS 处于活动状态并正在访问位置。它在我的应用程序处于活动状态的整个过程中一直保持打开状态(即使它在后台)。在我强行退出应用程序(多任务菜单向上滑动退出)之前,GPS 访问标志一直亮着。一旦用户访问地图,内存使用量就会翻倍(40Mb 到 100mb)并在用户滚动 Google 地图视图时不断增加。即使我退出地图,内存仍保持在 100+ mbs。
我想知道的是,
- 我在这里正确使用地图了吗?
- 我还能做些什么才能不使用 GPS,除非我真的需要它?退出正在访问地图的 viewController 后,我可以调用一个函数吗?
- 还有什么有用的吗?
谢谢。
目前还没有好的解决方案,但是使用 iOS9 您将能够访问该位置,只需一秒钟即可更新用户的位置。
您正在做的事情没问题 - 如果您在适当的时候调用 stopUpdatingLocation
,那么您正在最大限度地减少定位服务对设备的影响。据我所知,状态栏中的定位服务箭头并不指示 GPS 接收器或任何其他定位服务硬件的状态,它仅向用户表明您的应用正在使用定位服务。即使您的应用当前没有接收位置更新,它已经访问了用户位置并有权这样做,所以用户会收到他们的位置正在被使用的通知。
但是,您应该注意在收到位置后立即关闭定位服务更新,因为初始定位可能不准确 - 您应该检查 horizontalAccuracy
属性 来决定如果位置足够准确。
就内存使用而言,地图视图将缓存屏幕外的地图图像。获取此图像会消耗数据(可能是蜂窝数据)和 运行 无线电的电池;对于您的应用程序来说,消耗内存比不必要地重复获取相同数据要好得多。
请记住,iOS 不是像 Windows 或 OS X 那样的多任务环境 - 其他应用程序并不是真正的 运行ning当您的应用程序运行时以及当您的应用程序处于后台时,如果内存不足,则可以清除它(当您的应用程序位于前台时,您也可以收到内存不足通知)。
我的目标是:在用户使用我的应用程序时智能地管理用户 phone 内存和电池使用情况。
我正在 iOS 应用程序中使用 MapKit 和 Google 地图。最初启动该应用程序时,我要求获得访问该位置的授权(稍后我将在该应用程序中使用)。
我使用地图的第一个地方是在获取路线时。 授权码如下:
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
if status == CLAuthorizationStatus.AuthorizedWhenInUse {
viewMap.myLocationEnabled = true
} else if status == CLAuthorizationStatus.NotDetermined {
println("Location disabled")
viewMap.myLocationEnabled = false
}
}
我使用地图的第二个地方是检索在我第一次访问地图期间在特定位置创建的一些数据。基本上只是当前位置如下。
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
startLocation = nil
获得位置后,我将其称为:
locationManager.stopUpdatingLocation()
问题是:应用程序一启动,我就可以看到标志(状态栏中的小三角形)表明 GPS 处于活动状态并正在访问位置。它在我的应用程序处于活动状态的整个过程中一直保持打开状态(即使它在后台)。在我强行退出应用程序(多任务菜单向上滑动退出)之前,GPS 访问标志一直亮着。一旦用户访问地图,内存使用量就会翻倍(40Mb 到 100mb)并在用户滚动 Google 地图视图时不断增加。即使我退出地图,内存仍保持在 100+ mbs。
我想知道的是, - 我在这里正确使用地图了吗? - 我还能做些什么才能不使用 GPS,除非我真的需要它?退出正在访问地图的 viewController 后,我可以调用一个函数吗? - 还有什么有用的吗?
谢谢。
目前还没有好的解决方案,但是使用 iOS9 您将能够访问该位置,只需一秒钟即可更新用户的位置。
您正在做的事情没问题 - 如果您在适当的时候调用 stopUpdatingLocation
,那么您正在最大限度地减少定位服务对设备的影响。据我所知,状态栏中的定位服务箭头并不指示 GPS 接收器或任何其他定位服务硬件的状态,它仅向用户表明您的应用正在使用定位服务。即使您的应用当前没有接收位置更新,它已经访问了用户位置并有权这样做,所以用户会收到他们的位置正在被使用的通知。
但是,您应该注意在收到位置后立即关闭定位服务更新,因为初始定位可能不准确 - 您应该检查 horizontalAccuracy
属性 来决定如果位置足够准确。
就内存使用而言,地图视图将缓存屏幕外的地图图像。获取此图像会消耗数据(可能是蜂窝数据)和 运行 无线电的电池;对于您的应用程序来说,消耗内存比不必要地重复获取相同数据要好得多。
请记住,iOS 不是像 Windows 或 OS X 那样的多任务环境 - 其他应用程序并不是真正的 运行ning当您的应用程序运行时以及当您的应用程序处于后台时,如果内存不足,则可以清除它(当您的应用程序位于前台时,您也可以收到内存不足通知)。