ios - 在模型与 Controller 中使用 CoreLocation 的最佳实践

标签 ios objective-c core-location

我正在尝试找出构建我的应用程序的最佳方式。我目前有一个围绕 CLLocationManager 的包装类,它将自己设置为委托(delegate)并处理我们需要的所有额外设置和业务逻辑。它也是一个单例 (sharedManager)。

我想尽可能忠实于 MVC,并将尽可能多的逻辑插入我的模型,但我不确定最好的方法是做到这一点。目前, Controller 和模型都在获取 sharedManager 并在其上调用方法,例如在呈现模态( Controller )之前检查位置是否可用或在进行 REST 调用(模型)之前获取当前位置,但这感觉非常耦合且难以测试。

我想尽可能地使用依赖注入(inject)来避免在我的代码的所有部分不断地查询单例方法,但我想不出最好的方法。

我的一些想法:

  • 将我的 CLLocationManager 包装器转换为使用通知与应用程序的所有部分对话以改进解耦。然后我可以使用单例进行启动/停止调用,但让我的 Controller /模型通过收听通知对更改使用react。这仍然无法避免到处使用单例。

  • 仅在 Controller 中使用单例,并通过设置属性将所需的位置数据传递给模型。感觉这会让我的模型更容易测试,但不会让我的 Controller 更容易测试,而且将核心位置代码放在 Controller 中也感觉很恶心。

  • 我可以通过在模型和 Controller 上设置属性来传递我的自定义位置管理器包装器的一个实例,但这感觉有点乏味,而且还有一个问题是我在哪里创建初始管理器?

我希望能从对这个问题有更深入思考的人那里得到一些建议。欢迎和赞赏所有想法!

最佳答案

I'd like to use dependency injection as much as possible to avoid constantly querying the singleton method in all parts of my code, but I can't figure out the best way to do it.

你回答你自己的问题:

I could pass an instance of my custom location manager wrapper around by setting properties on both models and controllers, but that feels a bit tedious and stills leaves the question as to where do I create the initial manager?

让您的包装器成为单例并没有错,并且将对它的引用传递给需要它的对象——这是处理依赖注入(inject)的一种方式。你可以有很多对象依赖于它的接口(interface),但如果你想远离它作为一个单例,你也可以这样做。

您的模型不必知道您的位置管理器是单例。也许只有您的 Controller 会这样做。或者您可以在您的应用程序中选择一个或几个知道位置管理器的单例性质的根位置,并将其注入(inject)依赖组件。您希望如何执行此操作在很大程度上取决于您现有的应用程序架构。您可以为它创建一个“查找器”(使其再次变得很像单例)或将其作为参数传递到构造函数中——这是一种有时会被忽视的依赖注入(inject)方法。

我还建议查看 Key Value Observing并且可能让您的模型或 Controller 观察位置管理器上的位置属性。我个人也喜欢使用 Reactive Cocoa作为“带 block 的 KVO”库,不必一头扎进函数式响应式(Reactive)编程。 ReactiveCocoa 可以节省很多headaches与 Objective-C 中非常强大的 KVO 系统相关联。

我不提倡使用通知来传达像单个位置这样的核心更改。我曾经让事情变得非常困惑。 Objective-C 程序中的常见模式是“messages-leafward/notifications-appward”。

您在位置管理器包装器中拥有的本质上是一种位置服务。将大量业务逻辑放在这些服务中而不是模型中(有意义的地方)并不是一个坏主意。例如,如果您有关于位置变化传播到 UI 变化的频率或移动阈值的业务逻辑,那么这些可能适用于各种不同的模型。在位置服务中使用与位置相关的通用业务逻辑确实会使您的模型变干。

关于ios - 在模型与 Controller 中使用 CoreLocation 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655508/

相关文章:

ios - UITableViewCell 中的约束更新不正确

ios - 使用 AVMutableCompositionTrack 合并 AVMutableComposition 中的视频和图像,而不是 AVVideoCompositionCoreAnimationTool?

Objective-C:消息语法与点语法;有什么不同?

ios - 在 iOS 中返回 Viewcontroller 时如何释放 nsmutablearray

ios - 如何在 Xamarin 表单 iOS 应用程序中打开 Apple Store 而不是 iTunes 商店

objective-c - 我的 NSMutableArray 不起作用

ios - 健康栏的 CCProgressNode 不工作

ios - 获取用户位置和更新

iphone - 是否可以从 iPhone 应用程序中关闭漫游?

iphone - 检测wifi是否开启 - iOS