构建一个Foursquare克隆iOS应用-第4部分:流式传输位置
- 第1部分:简介和设置
- 第2部分:位置数据和管理依赖项
- 第三部分:持续集成
- 第4部分:流媒体位置
- 第5部分:网络层
- 第六部分:国家管理
在这一部分中,我们将继续实现UserLocationService
类,该类负责获取和传输用户位置。
ReactiveX API将用于此传输,使我们能够锻炼反应性技能并编写更具可读性的测试。
首先,我想对这个很棒的库做一个(非常简单的)介绍,这样您就可以了解本文中的代码将要做什么以及它的主要概念。
我想重点介绍两个概念:
- 数据流:考虑另一种在两个类或结构之间传输数据(数组或字符串)的方式。 一种方法是通过
public
方法中的参数或通过NSNotificationCenter广播此数据。 使用ReactiveX库,您可以将任何数据包装到另一个名为Observable
类中,该类为您提供了强大的运算符来进行操作。 - 观察者模式:想要接收数据的实例必须订阅发送数据的实例。
然后使用这两个概念,我们需要对UserLocationService
类进行的修改是:
- 包装
CLLocation
接收到的本机位置对象CLLocation
成为Observable
。 - 只要有此数据,就允许另一个类或结构订阅
UserLocationService
类以接收Observable
。
为了实现以上第1项,我们将专门使用提供的类型Subject
。 通过引用官方文档:
它可以通过释放它们观察到的项目,也可以发射新项目。
这意味着我们可以使用Subject
作为代理来接收CLLocation
并发送给它的Observer
。
为了实现第2项,我们将添加一个名为getUserLocation
的内部方法来公开Subject
实例。
鉴于此,我们将在本系列文章的第2部分之后编写UserLocationService
的下一个代码迭代:
幸运的是,到目前为止,我们设计应用程序的方式使我们有机会测试最后一个功能。 通过将协议注入UserLocationService
构造函数,我们可以轻松模拟设备获得的位置。
这些是我阐述的新案例:
-
CLLocationManager
类提供的位置应与UserLocationService
提供的位置相同。 - 如果
CLLocationManager
某种原因失败,则应通过UserLocationService
类传递此错误,以在UI上进行处理。
现在翻译为代码:
请注意,自上一篇文章以来已进行了一些重构,特别是将依赖项解析移至setUp
方法。 检查Github存储库的完整源代码,并检查为UserLocationService
类编写的所有测试。
我们可以学习ReactiveX的一些基本概念,以及如何使用此工具将本机API转换为反应式范例。 也不要忘记通过编写测试来确保应用程序的逻辑正常工作。
现在我们有了用户位置,在下一步中,我们将学习如何发出HTTP请求以获取该位置的附近位置。
下一部分:网络层