我需要一种方法来获取用户当前位置。
由于用户有朋友,并且他们也有位置数据,我认为正确的方法是在Friend
和User
个实体的核心数据数据库中放置一个位置字段
现在,这就是我的想法:
有某种位置管理员singelton,每当我需要准确的位置时,我就告诉他开始CLLocationManager
更新。 (我的经理负责)
管理器将位置保存在Db中的user.location字段中,对user.location信息感兴趣的控制器将使用KVO注册到该数据。
这对我来说听起来不错,除了我必须从需要准确位置的每个控制器访问这个位置singelton这一事实(为了告诉他开始生成位置,我不希望位置更新一直在进行)。另外,我尝试不要用一堆singelton调用来污染我的代码。
我认为将位置管理器作为我User
类中的属性可能更明智。 (显然,如果我现在在内存中有一些用户,他们将共享相同的位置管理员singelton)
我将向用户类添加另一个方法并将其命名为“StartGettingLocation
”,现在只要某个控制器需要当前的准确位置,他就可以执行以下操作之一:
StartGettingLocation
”方法和KVO他的位置字段。这听起来不错吗?
如果是这样,我不确定的是,是否可以将MyLocationManager的新成员添加到我的User类(它是managedObject的子类)? 什么是实现这一目标的正确方法?
由于
答案 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)。