Fork me on GitHub

objc中国学习--更轻量的 View Controllers

从今天开始学习objc中国的所有博客。

更轻量的 View Controllers

  • 介绍

  • 更轻量的 View Controllers

  • 整洁的 Table View 代码

  • 测试 View Controllers

  • View Controller 容器

NSCoding协议
NSKeyedArchiver归档

为了将应用数据存储到硬盘中实现数据持久化,iOS提供3种方法:

  • 属性列表:基本的文件API、Property List序列化
  • 数据库:SQLite、CoreData
  • 序列化:NSKeyedArchiver以及NSCoding

对于轻量级的数据要求,NSCoding因其简单而成为一种比较合适的方式。 NSCoding是一个你需要在数据类上要实现的协议以支持数据类和数据流间的编码和解码。数据流可以持久化到硬盘。

使用NSCoding协议可以实现归档自定义的类,NSKeyedArchiver可以归档我们自定义的类。

归档 NSKeyedArchiver(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象。

归档方式:

  • 对Foundation框架中对象进行归档 (一次只能归档一个对象,如果是多个对象归档需要分开进行)
  • 对自定义的内容进行归档
  • 对自定义的对象进行归档 (用到NSCoding协议,一次可以归档多个对象,通过归档的文件都是加密的)

要实现自定义类的归档,需要实现encodeWithCoder(编码/序列化)和initWithCoder(解码/反序列化)。

要编码的对象,必须实现NSCoding协议。

1
2
3
4
5
6
7
@protocol NSCoding
-(void) encoderWithCoder:(NSCoder *) aCoder;//保存
-(id) initWithCoder:(NSCoder *) aDecoder;//加载
@end

Mantle是一个意在减少写NSCoding样板文件的类库。如果你正在寻找更方便使用NSCoding代替Core Data创建model的方法,那Mantle值得一看。

可以参考我之前写的文章

把网络请求逻辑移到 Model 层

和上面的主题相似:不要在 view controller 中做网络请求的逻辑。取而代之,你应该将它们封装到另一个类中。这样,你的 view controller 就可以在之后通过使用带有回调(比如一个 completion 的 block)来请求网络了。这样的好处是,缓存和错误控制也可以在这个类里面完成。

让事情保持简单

测试简单的事情很简单,同样,测试复杂的事会很复杂。就像我们在其他文章中指出的那样,让事情保持简单小巧总是好的。除此之外,它还有利于我们测试。

让我们来看看测试驱动开发(简称 TDD)。我们在这里不深入讨论,只是如果用 TDD,你得在写代码之前先写好测试。

通常,如果你发现有些地方很难做测试,这就说明你的设计出了问题,你应该重构它。

测试会被 build 成一个 bundle,其中包含一个动态库和你选择的资源文件。如果你要测试某些资源文件,你得把它们加到测试的 target 中,Xcode 就会将它们打包到一个 bundle 中。

Xcode 中的每个 scheme 定义了相应的测试 bundle 是哪个。通过 ⌘-R 运行程序,⌘-U 运行测试。

测试的运行依附于程序的运行,当程序运行时,测试 bundle 将被注入(injected)。测试时,你可能不想让你的程序做太多的事,那样会对测试造成干扰。可以把下面的代码加到 app delegate 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static BOOL isRunningTests(void) __attribute__((const));
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (isRunningTests()) {
return YES;
}
//
// Normal logic goes here
//
return YES;
}
static BOOL isRunningTests(void)
{
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
return [[injectBundle pathExtension] isEqualToString:@"octest"];
}

参考

#1 更轻量的 View Controllers

TDD的iOS开发初步以及Kiwi使用入门Kiwi

Kiwi 使用进阶 Mock, Stub, 参数捕获和异步测试


版权声明



Ivan’s Blog by Ivan Ye is licensed under a Creative Commons BY-NC-ND 4.0 International License.
叶帆创作并维护的叶帆的博客博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Ivan’s Blog | 叶帆的博客博客( http://yeziahehe.com ),版权所有,侵权必究。

本文链接:http://yeziahehe.com/2015/09/09/Objc_learning--lighter_View_Controllers/