iPhone核心位置架构 - 如何在多个控制器上使用它

时间:2012-03-30 15:07:30

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

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

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

现在,这就是我的想法:

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

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

  1. 如果在我的控制器中我有一个User对象(由其他UIViewController传递),我只需要调用他的“StartGettingLocation”方法和KVO他的位置字段。
  2. 如果我的控制器中没有User对象,我会从我的数据库中获取它并按上述方式执行。
  3. 这听起来不错吗?

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

    由于

2 个答案:

答案 0 :(得分:4)

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

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

或者,您可以让CoreLocationManager成为自己的代理人,并在@property上设置CLLocation。您可以使用KVO通知观察者某个位置已按您的建议更改。我想这一切都取决于一个位置是否只与用户相关,或者一个位置是否是任何东西都可以使用的。

答案 1 :(得分:2)

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

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

这样,您只需在使用commonLocationManager.someReallyCoolProperty访问位置所需的任何类中添加应用委托标题。

编辑:

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