SimpleWeather App notes

使用到的开源库

Mantle
Mantle 是一个由 Github 团队维护的项目,旨在帮助移除 Objective-C 需要转换 JSON 数据为 NSObject 子类时的所有样板代码。Mantle 也可以进行值转换,它通过一种不可思议的方式把 JSON 原始值(strings, ints, floats)转换为复杂的值,类似于 NSDate, NSURL, 或则是自定义的类。

LBBlurredImage
LBBlurredImage 是一个扩展自 UIImageView 的小项目,它可以很容易地使图片模糊化。你将能够仅仅通过一行代码就能制作出不可思议的模糊效果。

TSMessages
TSMessages 是另一个棒极了的轻巧开源库,用来显示浮层警告和通知。当出现错误信息的时候不会直接影响用户,最好通过浮层取代一个模态视图(例如 UIAlertView)这样做更有利于用户体验。

ReactiveCocoa
这个也是由 Github 团队维护的一个库。ReactiveCocoa 给 Objective-C 带来了函数编程。

Demo

其他

在 iOS7 中,UIViewController 有一个新的 API,用来控制状态栏的外观。

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent
}

可以使用 Control-Command-Up 的快捷键来实现 .h 和 .m 文件之间的快速切换

之前没有见过的 @import 指令,它在 Xcode5 中被引入,是由苹果公司看作是一个现代的,更高效的替代 #import 方式导入系统库

有一个非常好的教程,涵盖了最新的 Objective-C 特性 - What’s New in Objective-C and Foundation in iOS 7

使用格式化的注释

//TODO:可以帮助 Xcode 找到需要以后完成的代码

还可以使用 Show Document Items(Control-6) 来查看 TODO 项。

视图控制器调用 - (void)viewWillLayoutSubviews; 方法来编排其子视图。

遵循以下基本步骤,来获你设备的位置的气象数据

  1. 找到设备的位
  2. 从 API 端下载 JSON 数
  3. 映射 JSON 到 WXConditions 和 WXDailyForecast
  4. 告诉 UI 有新数据了

获取天气数据

从 OpenWeatherMap 返回的 JSON 响应数据:

{
"dt": 1384279857,
"id": 5391959,
"main": {
    "humidity": 69,
    "pressure": 1025,
    "temp": 62.29,
    "temp_max": 69.01,
    "temp_min": 57.2
    },
"name": "San Francisco",
"weather": [{
    "description": "haze",
    "icon": "50d",
    "id": 721,
    "main": "Haze"
    }]
}

你需要把嵌套的 JSON 值映射到 Objective-C 的属性。嵌套的 JSON 值是元素,如温度,即上面看到的 main 节点

要做到这一点,你将利用的 Objective-C 的 Key-Value Coding 和 Mantle 的 MTLJSONAdapter。

ReactiveCocoa

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

Github 上提供的 a great overview of the benefits

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

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

[RACAble(self.username) subscribeNext:^(NSString *newName) {
    NSLog(@"%@", newName);
}];

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

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

日期格式化

为什么在 -init: 中初始化这些日期格式化,而不是在 -viewDidLoad: 中初始化他们

实际上 -viewDidLoad: 可以在一个视图控制器的生命周期中多次调用。NSDateFormatter 对象的初始化是昂贵的,而将它们放置在你的 -init,会确保被你的视图控制器初始化一次。