【问题标题】:iPhone Core Location architecture - How to use it across multiple ControllersiPhone Core Location 架构 - 如何跨多个控制器使用它
【发布时间】:2012-04-14 07:04:45
【问题描述】:

我需要一种方法来获取我的用户当前位置。

由于用户有朋友,而且他们也有位置数据,我认为正确的方法是在我的核心数据数据库中放置一个位置字段,包括FriendUser 实体。

现在,这就是我的想法:

有某种位置经理 singelton,每当我需要准确的位置时,我都会告诉他开始 CLLocationManager 更新。 (我的经理负责) 管理器将位置保存在 Db 中的 user.location 字段中,对 user.location 信息感兴趣的控制器将使用 KVO 向该数据注册。 这对我来说听起来不错,除了我必须从每个需要准确位置的控制器访问这个位置单(为了告诉他开始生成位置,我不希望位置更新一直处于打开状态)。另外,我尽量不要用一堆单次调用来污染我的代码。

尽管将位置管理器作为我的User 类中的属性可能更明智。 (显然,如果我现在有几个用户在内存中,他们都将共享同一个位置管理器 singelton) 我将在用户类中添加另一个方法并将其命名为“StartGettingLocation”,现在当某个控制器需要当前准确位置时,他可以执行以下操作之一:

  1. 如果在我的控制器中有一个用户对象(由其他 UIViewController 传递),我只需调用他的“StartGettingLocation”方法并 KVO 他的位置字段。
  2. 如果我的 Controller 中没有 User 对象,我会从我的数据库中获取它并按照上述方法进行操作。

这听起来对吗?

如果是这样,我不确定是否可以将 MyLocationManager 的新成员添加到我的 User 类(它是 managedObject 的子类)? 实现此目的的正确方法是什么?

谢谢

【问题讨论】:

    标签: ios core-data uiviewcontroller core-location key-value-observing


    【解决方案1】:

    我们将 CoreLocationManager 实现为 sharedInstance(单例)模式。我不确定您是否希望您的托管对象拥有 CoreLocation 行为,因为它确实不是特定于 User 的东西,而是设备(即 iPhone、iPad)。

    CoreLocationManager 也不应该更新数据库记录。其目的是发送更新的位置。其他东西需要监听这些更新,所以你可以让其他东西实现CLLocationManagerDelegate,这反过来又可以更新托管对象。

    或者,您可以让您的CoreLocationManager 成为它自己的代表,并在CLLocation 上拥有一个@property。您可以使用 KVO 通知观察者位置已按照您的建议更改。我想这一切都取决于位置是否仅与用户相关,或者位置是否可以使用。

    【讨论】:

    • 我不认为您的 CoreLocationManager 负责发送位置更新,这是苹果的 CLLocationManager 责任。我希望您的 CoreLocationManager 符合 CLLocationManagerDelegate。然后它将决定如何处理位置更新,是否将其保存到数据库或只是发布相关通知。是的,位置只与当前登录的用户相关,所以让其他控制器 KVO 听起来很合理。希望我理解正确。
    • 你是对的。我们的 CoreLocationManager 不发送位置更新,它只是 CLLocationManager 的包装器。我们有从管理器启动/停止 CLLocationManager 实例的方法。我们还实现了 CLLocationManagerDelegate 来更新管理器上的 CLLocation 属性。抱歉,如果我没有说得很清楚。
    • 对,那么当位置发生变化时,如何让其他控制器知道呢?你发布通知吗?保存到您的数据库并让其他 KVO 使用它?
    • CLLocation 属性更新并触发 KVO。但是,在很多情况下,我们会创建一些关心位置的短期对象,因此这些对象只是直接从管理器获取属性。
    • 但是如果您只是从您的经理那里访问 CLLocation 属性,您如何确保它是最新的?除非您的 CLLocationManager 一直在运行以获取更新的位置。 (这是耗尽电池的配方)。
    【解决方案2】:

    我通常将我的位置管理器作为应用程序委托的属性,然后从应用程序中的任何位置以[[[UIApplication sharedApplication] delegate] myLocationManager] 访问它非常容易。在 AppDelegate.h 文件中使用 #define 也很方便,例如...

    #define commonLocationManager [[[UIApplication sharedApplication] delegate] myLocationManager]
    

    这样,您只需在任何需要使用commonLocationManager.someReallyCoolProperty 访问位置的类中包含应用程序委托标头。

    编辑:

    每当我需要我的 UI 来反映位置或任何其他状态的变化时,我都会使用 key-value observing (KVO)。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2023-03-07
      • 2016-02-23
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多