【问题标题】:best way to use CoreLocation across multiple views在多个视图中使用 CoreLocation 的最佳方式
【发布时间】:2011-06-09 19:35:52
【问题描述】:

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

这里是创建一个封装 CoreLocation 东西并在地图视图中引用它的单例的最佳方法,还是使用通知?还是为我的场景使用其他更好的做法?

谢谢

【问题讨论】:

    标签: iphone objective-c ios mapkit core-location


    【解决方案1】:

    我有几个应用程序在多个地方使用CoreLocation。根据我的阅读,您肯定希望只有一个 CLLocationManager 实例。对我来说,它作为单身人士非常有用。

    希望这会有所帮助!

    【讨论】:

    • 你有单例背后推理的参考链接吗?谢谢
    • 我只是快速搜索了一下,但找不到我在哪里读到的。对不起!但是让它只被实例化一次是完全有意义的。
    • 我还为我的位置管理器使用了单例,这样不仅可以随时随地访问它的属性和 - 更重要的是 - 方法,而且还可以监控位置变化(或位置可用性更改)并在发生更改时向关键侦听器发送通知。
    • 好的,我对此进行了更多思考,我认为,总的来说,这是最好的方法。我不需要用制造的实体污染我的对象模型,我可以很好地将所有 coreLocation 东西封装到一个单例中,我什至可以通过简单地根据前景中的哪个视图切换委托来省去通知。谢谢!
    • Singleton 是了解和使用的好东西,如果您知道何时以及为什么使用它。但是你不应该仅仅因为“它有效”而使用它。您应该知道,在您的应用程序的生命周期中,单例将保留在内存中,而不仅仅是您实际需要的特定视图。
    【解决方案2】:

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

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

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

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

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

    5. 如果您愿意,可以在 CalculatingView 中分配和初始化 MapView。不过在其他地方也可以,只要能发消息到MapView。通过检查它是否不是 nil 或它是否 respondsToSelector 来确保它们是有效的。

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

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

    8. 通过检查 MapView 是否有效,即是否已加载显示,您可以决定是否向 MapView 发送消息

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

    单例很好,但除非你要在多个地方使用 CLLocationManager,比如超过 3~4 个地方,否则我认为没有必要

    希望我没有让你感到困惑。根据您发布的内容,这种方式似乎可以成为您目标的简单解决方案。如果我没有听懂你的真实意图,请告诉我。

    【讨论】:

      【解决方案3】:

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

      顺便说一句,Apple 的 LocateMe 应用程序将位置管理器实例化了 3 次。因此,以他们为例,拥有多个 LocationManager 可能不是问题。

      【讨论】:

        【解决方案4】:

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

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

        ....imports....
        
        @implementation YourViewController
        
        - (void)viewDidLoad {
           self.myLocationManager = [[UIApplication sharedApplication] delegate].yourLocationManagerVarName;
        }
        
        @end
        

        有帮助的跳。

        【讨论】:

          【解决方案5】:

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

          @interface User {}
          @property (nonatomic, retain) CLLocation *location;
          @end
          
          @implementation User
          @synthesize location;
          - (void)dealloc {
            self.location = nil;
            [super dealloc];
          }
          @end
          

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

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

          此时,您拥有一个功能齐全的应用,没有任何 UI。这是一个很好的设计,可以重复使用和测试。

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

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

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

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

          根据其他答案:

          • 在您的代码中创建多个 CLLocationManager 实例并没有真正的惩罚。唯一的副作用是 api 是异步的,因此您必须等待在视图控制器中获取有效位置。您可以尝试使用 locationManager.location API 从 viewDidLoad 上的位置管理器获取当前位置。
          • 不要分享来自您的应用委托的内容。这会阻止代码重用。如果您重复使用您的视图并且您的应用代理没有位置管理器怎么办?

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

          【讨论】:

          • 感谢您的回复,我明白了您的观点,但用户在我的应用程序中并不是一个真实的概念,所以这代表了一个纯粹虚构的实体。此外,如果您添加相关的细节,这很容易只是一个单例实现,有或没有通知,感谢您的输入
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多