构建一个Foursquare克隆iOS应用-第4部分:流式传输位置

  • 第1部分:简介和设置
  • 第2部分:位置数据和管理依赖项
  • 第三部分:持续集成
  • 第4部分:流媒体位置
  • 第5部分:网络层
  • 第六部分:国家管理

在这一部分中,我们将继续实现UserLocationService类,该类负责获取和传输用户位置。

ReactiveX API将用于此传输,使我们能够锻炼反应性技能并编写更具可读性的测试。

首先,我想对这个很棒的库做一个(非常简单的)介绍,这样您就可以了解本文中的代码将要做什么以及它的主要概念。

我想重点介绍两个概念:

  • 数据流:考虑另一种在两个类或结构之间传输数据(数组或字符串)的方式。 一种方法是通过public方法中的参数或通过NSNotificationCenter广播此数据。 使用ReactiveX库,您可以将任何数据包装到另一个名为Observable类中,该类为您提供了强大的运算符来进行操作。
  • 观察者模式:想要接收数据的实例必须订阅发送数据的实例。

然后使用这两个概念,我们需要对UserLocationService类进行的修改是:

  1. 包装CLLocation接收到的本机位置对象CLLocation成为Observable
  2. 只要有此数据,就允许另一个类或结构订阅UserLocationService类以接收Observable

为了实现以上第1项,我们将专门使用提供的类型Subject 。 通过引用官方文档:

它可以通过释放它们观察到的项目,也可以发射新项目。

这意味着我们可以使用Subject作为代理来接收CLLocation并发送给它的Observer

为了实现第2项,我们将添加一个名为getUserLocation的内部方法来公开Subject实例。

鉴于此,我们将在本系列文章的第2部分之后编写UserLocationService的下一个代码迭代:

注意getUserLocation方法return中的类型转换

幸运的是,到目前为止,我们设计应用程序的方式使我们有机会测试最后一个功能。 通过将协议注入UserLocationService构造函数,我们可以轻松模拟设备获得的位置。

这些是我阐述的新案例:

  • CLLocationManager类提供的位置应与UserLocationService提供的位置相同。
  • 如果CLLocationManager某种原因失败,则应通过UserLocationService类传递此错误,以在UI上进行处理。

现在翻译为代码:

请注意,自上一篇文章以来已进行了一些重构,特别是将依赖项解析移至setUp方法。 检查Github存储库的完整源代码,并检查为UserLocationService类编写的所有测试。

我们可以学习ReactiveX的一些基本概念,以及如何使用此工具将本机API转换为反应式范例。 也不要忘记通过编写测试来确保应用程序的逻辑正常工作。

现在我们有了用户位置,在下一步中,我们将学习如何发出HTTP请求以获取该位置的附近位置。

下一部分:网络层