繁体   English   中英

跨多个视图使用CoreLocation的最佳方法

[英]best way to use CoreLocation across multiple views

我的应用程序中有两个视图,一个是一般视图,其中CoreLocation在用户在视图中执行其他操作时计算用户位置。 用户在触摸按钮时访问第二个视图,允许他们使用mapview和MapKit更准确地定位自己,我希望此视图中的mapview显示CoreLocation已在第一个视图中识别的位置并继续根据另一个视图中CoreLocation的更新显示此位置。

这是创建封装CoreLocation内容的单例并在视图中使用地图引用或使用通知的最佳方法吗? 或者为我的场景使用其他一些更好的练习?

谢谢

我有几个在多个地方使用CoreLocation的应用程序。 从我读过的内容来看,你肯定希望只有一个CLLocationManager实例。 它对我来说是一个很好的单身人士。

希望这可以帮助!

如果我是你,我会这样做:

  1. 决定始终加载哪个视图。 我假设,您希望一直加载CalculatingView ,并根据用户操作加载/卸载MapView

  2. CalculatingView中分配并初始化指向CLLocationManager的指针。 这将提供位置属性并调用委托消息。 由于加载并保留了CalculatingView ,因此该指针也始终有效。

  3. 如果此视图已分配并初始化CLLocationManager指针,则将CLLocationManager的委托设置为CalculatingView ,也可称为self

  4. CalculatingView中实现CLLocationManager的委托方法

  5. 如果您愿意,可以在CalculatingView中分配和初始化MapView 但只要你可以向MapView发送消息,就可以在其他地方使用它。 通过检查它是否为零或是否响应ToSelector来确保它们有效。

  6. CLLocationManager的委托(即CalculatingView)接收消息时,向MapView发送消息。

  7. 这就像转发消息一样,但MapView应该响应的消息不必是发送到CalculatingView的相同消息,就像来自CLLocationManager的委托方法调用一样

  8. 通过检查MapView是否有效,这意味着如果它被加载以显示,您可以决定是否向MapView发送消息

本质是决定哪个视图是否被加载,使用委托方法将消息发送(或中继)到其他指针(在本例中为MapView指针)。

单身是好的,但除非你要从多个地方使用CLLocationManager ,比如超过3~4个地方,我认为没有必要

希望我没有混淆你。 根据您发布的内容,这种方式似乎可以为您的目标提供简单的解决方案。 如果我没有抓住你的真实意图,请告诉我。

我不确定这是最好的方法,但我一直在设置我的主控制器(首先加载的控制器)作为位置管理器代表。 当位置更新时,它会以新位置作为通知对象触发通知。 然后,任何侦听控制器都可以使用该数据,但需要它们。

另外,Apple的LocateMe应用程序实例化了三次位置管理器。 因此,通过他们的例子,拥有多个LocationManagers可能不是问题。

根据我的阅读,最佳做法是将CLLocationManager添加到App Delegate因为您可以从任何视图访问它。

简短的示例代码放在您需要CLLocationManager的视图中

....imports....

@implementation YourViewController

- (void)viewDidLoad {
   self.myLocationManager = [[UIApplication sharedApplication] delegate].yourLocationManagerVarName;
}

@end

跳帮助。

也许你应该考虑一种面向MVC的方法。 根据您的描述,您缺少用户的模型层表示。 使用基本CLLocation属性定义一个简单的User类将是第一步。

@interface User {}
@property (nonatomic, retain) CLLocation *location;
@end

@implementation User
@synthesize location;
- (void)dealloc {
  self.location = nil;
  [super dealloc];
}
@end

用户的同一实例将传递给您的视图控制器。 它可以在app委托中创建。

接下来为您的应用创建位置服务对象。 它将启动CLLocationManager,并将位置提供给您的用户。 您可能必须设置GPS准确度,忽略您不想要的帧,并在此处实现基本LBS逻辑。

此时,您有一个功能完整的应用程序,没有任何UI。 这是一种可以重复使用和测试的好设计。

现在将您的UI叠加在其上。 为您的根控制器提供指向应用程序委托中的User实例的指针。 视图控制器将此指针传递给它创建的模态/导航视图控制器。

该控制器开始在viewDidLoad中观察用户的位置变化并做出相应的反应。

- (void)viewDidLoad {
   [self observeValueForKeyPath:@"location" ofObject:self.user change:0 context:NULL];
}

您的视图控制器还会注册您的位置服务对象引发的通知,以向用户显示警报。

基于其他答案:

  • 在代码中创建多个CLLocationManager实例没有真正的代价。 唯一的副作用是api是异步的,因此你必须等待在视图控制器中获得一个有效的位置。 您可以尝试使用locationManager.location API从viewDidLoad上的位置管理器获取当前位置。
  • 不要分享您的应用代表的东西。 这可以防止代码重用。 如果您重复使用您的视图并且您的app delegate没有位置管理器,该怎么办?

如果您需要更多代码,请询问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM