上下文:
我的应用需要在几个不相关的视图控制器中用户的当前位置,并且到目前为止,我正在每个这些控制器中创建一个CLLocationManager并一遍又一遍地请求当前位置。
但是,这对我来说并不正确。它是重复的代码和无效的。 我在互联网上看到过一些提及单身人士位置管理器的参考。而且我还听说尽量避免单身。
问题:
我应该创建一个管理位置的单例类吗?如果没有,您建议采取什么其他解决方案来避免重复的代码?
答案 0 :(得分:2)
我也听说要尽量避免单身人士
在应用程序运行的某些脱循环周期需要该数据的情况下,上述陈述是正确的,因此从内存的角度来看,完成单例操作后,从应用程序的整个生命周期(在您的情况下,所有vcs都保持有效)来看,这成为一个问题。该应用程序需要的位置)最适合单身人士,避免重复-代码效率低和内存过多问题
不用说90%的苹果类使用单例e.x
URLSession.shared
NSNotificationCenter.default
UNUserNotificationCenter.current
UserDefaults.standard
FileManager.default
答案 1 :(得分:1)
没有硬性规定。苹果非常清楚,实例化多个位置管理器是可以的。但是,如果这样做,您可能会感到困惑,因为每个人都需要一个委托,每个人都需要自己的设置,依此类推。因此,对这种方法保持警惕是正确的。
这是一种标准策略,选择一个在应用程序的整个生命周期中都存在的实例(例如,您的应用程序委托或您的根视图控制器),并使用位置管理器初始化实例属性。没有理由在混合中添加Singleton模式。您只需制造一个就可以了。
答案 2 :(得分:1)
模式不是邪恶的。这取决于用户。它们是针对特定问题的解决方案。这取决于您如何看待问题以及想要实现的目标。
在您的情况下,您需要在整个应用程序中使用一个位置管理器实例,并在多个地方使用它,因此您需要一个包装管理器。如果只需要一种配置,那么使用单例是有意义的。
只要您需要,Apple建议您强烈推荐该经理。 CLLocationManager - Apple Documentation
创建CLLocationManager类的实例,并将对它的强引用存储在应用程序中的某个位置。 在完成涉及该对象的所有任务之前,必须保持对位置管理器对象的强烈引用。由于大多数位置管理器任务都是异步运行的,因此将位置管理器存储在本地变量中是不够的。
答案 3 :(得分:1)
如果创建单例位置管理器,则它必须做的事情与其他单例不同。您不能使用普通的委托模式来通知其他对象有关位置更新和错误的信息,因为普通的委托模式是一对一的关系。您必须使用多个委托(单例包含一组感兴趣的对象,并且向每个对象发送相同的消息,例如位置更新)。这是另一个为什么很难使用的问题:
您可以通过通知来解决这个问题,但我个人认为这是一个不好的模式(它使事情之间的耦合度过高,并且很难遵循责任的道路)。
单例还必须跟踪其感兴趣的任何对象是否要求其停止或启动。如果他们都要求它停止,则应该关闭更新。如果仅一个人想要更新,则必须为其供电。搜索所有正在构建框架的人员,以使用网络指示器执行相同的任务,以查看这有多麻烦。
如果请求位置时发生错误,则必须保存该错误,并且(稍后)对象要定位时,必须重新发送该错误。因此,实际上,您希望一开始就将所有感兴趣的对象连接起来并进行监听,以免发生这种情况。
我敢肯定,我会想到更多您需要处理的多毛案件。
介于中间的选项是使用特殊的设置,错误检查等创建位置管理器类,并在需要时实例化其中之一。使用委托模式从中获取消息(大多数将只是直接传递消息)。