iOS7 最佳实践:一个天气应用案例(下)

2142 查看

开始

你有两个选择开始本教程:您可以使用在本教程的第1部分你已完成的项目,或者你可以在这里下载第1部分已完成的项目

在前面的教程中你创建了你的App的天气模型 – 现在你需要使用OpenWeatherMap API为你的App来获取一些数据。你将使用两个类抽象数据抓取、分析、存储:WXClientWXManager

WXClient的唯一责任是创建API请求,并解析它们;别人可以不用担心用数据做什么以及如何存储它。划分类的不同工作职责的设计模式被称为关注点分离。这使你的代码更容易理解,扩展和维护。

与ReactiveCocoa工作

确保你使用SimpleWeather.xcworkspace,打开WXClient.h并增加imports

WXClient.h中添加下列四个方法到接口申明:

现在,似乎是一个很好的机会来介绍ReactiveCocoa

ReactiveCocoa(RAC)是一个Objective-C的框架,用于函数式反应型编程,它提供了组合和转化数据流的API。代替专注于编写串行的代码 – 执行有序的代码队列 – 可以响应非确定性事件。

Github上提供的a great overview of the benefits

  • 对未来数据的进行组合操作的能力。
  • 减少状态和可变性。
  • 用声明的形式来定义行为和属性之间的关系。
  • 为异步操作带来一个统一的,高层次的接口。
  • 在KVO的基础上建立一个优雅的API。

例如,你可以监听username属性的变化,用这样的代码:

subscribeNext这个block会在self.username属性变化的时候执行。新的值会传递给这个block。

您还可以合并信号并组合数据到一个组合数据中。下面的示例取自于ReactiveCocoa的Github页面:

RACSignal对象捕捉当前和未来的值。信号可以被观察者链接,组合和反应。信号实际上不会执行,直到它被订阅。

这意味着调用[mySignal fetchCurrentConditionsForLocation:someLocation];不会做什么,但创建并返回一个信号。你将看到之后如何订阅和反应。

打开WXClient.m加入以下imports:

在imports下,添加私有接口:

这个接口用这个属性来管理API请求的URL session。

添加以下init放到到@implementation@end之间: