iOS App 数据持久化

数据的持久化就是让数据能够持久的保存,实现它的方法有两种:云端和本地。本文试着简单总结本地持久化的方法。

本地持久化其实就是将数据保存到闪存,那么我们应该用什么方法保存,又应该保存在哪呢?

文件系统基础

在OS X和iOS中,文件系统处理数据文件,应用程序和操作系统本身相关文件的持久存储。下面简要介绍下 iOS 文件系统的基础知识,以便我们更好的使用她。

iOS应用和文件系统的交互基本上仅限于它沙盒内目录。新应用安装过程中,安装程序为应用创建了数个容器。每个容器有个特定的角色。The bundle container holds the app’s bundle, whereas the data container holds data for both the application and the user. The data container is further divided into a number of directories that the app can use to sort and organize its data. The app may also request access to additional containers—for example, the iCloud container—at runtime.

这些容器构成了应用文件系统的基本面。下图是应用沙盒的示意图。

"App Sandbox"

iOS应用常用的目录列表:

Directory Description
AppName.app This is the app’s bundle
Documents/ Use this directory to store user-generated content.
Documents/Inbox Use this directory to access files that your app was asked to open by outside entities.
Library/ This is the top-level directory for any files that are not user data files.
tmp/ Use this directory to write temporary files that do not need to persist between launches of your app.

数据的建议存储位置

限于篇幅,关于应用的数据应该放到哪,可以查阅File System Programming Guide > File System Basics > About the iOS File System > Where You Should Put Your App’s Files

数据持久化的方法

  1. NSUserDefaults;
  2. Property Lists;
  3. Archive;
  4. 数据库;
  5. Core Data。
继续阅读

Key-Value Coding & Key-Value Observing

Key-Value Coding

  1. Key-Value Coding是什么?
  2. 为什么要用Key-Value Coding?
  3. 如何使用Key-Value Coding?

Key-Value Coding是什么?

Key-value coding is a mechanism for accessing an object’s properties indirectly, using strings to identify properties, rather than through invocation of an accessor method or accessing them directly through instance variables.

Key-value coding是一种间接访问对象属性的机制,使用字符串去标识属性,而不是通过调用存取方法或者通过实例变量直接访问它们。

为什么要用Key-Value Coding?

  1. Scripting(OS X);
  2. 简化代码和提高灵活性;

如何使用Key-Value Coding?

我们先熟悉些下key-value coding术语,后文我们用术语来阐述,方便交流。

除了重载现有的术语,key-value coding定义了些专属的术语。

Key-value coding可以被用来访问三种不同的类型的对象值:attributes, to-one relationships, 和to-many relationships。术语property指三种类型值的任意一种。

attribute 是简单值的 property,像标量,字符串,或者布尔值。NSNumber和其他的不可变类型如NSColor也都被认为是attributes。

to-one relationship 是拥有自己properties的对象。这些内部的properties可以改变而对象却不变。例如,NSView实例的superview就是to-one relationship。

to-many relationship 包括一个相关对象的集合。NSArray或NSSet经常被用来持有这样一个集合。但是,key-value coding允许你使用自定义的类作为集合,通过实现在to-many Properties中讨论的key-value coding存取方法仍然可以可以像NSArray或NSSet那样访问它们。

要使用 Key-Value Coding,对象要符合 Key-Value Coding Compliant,符合 Key-Value Coding Compliant 则有两点要求:一是对象遵守 NSKeyValueCoding 协议;二是要实现规定的方法。

因为 NSObject 已经遵守 NSKeyValueCoding 协议,所以类继承 NSObject 这个要求就默认满足了。于是重点就是实现规定的方法。那么规定的方法是哪些呢?

对于 Attribute 和 To-One Relationship Compliance

  • 实现 <key> 或者 is<Key>, 或者创建 <key> 或者 _<key> 实例变量。
  • 如果属性可变,实现 set<Key> 方法。
  • 如果属性是标量,覆盖 setNilValueForKey: 方法去优雅处理 nil 。

对于 to-many relationship 的属性,实现上述方法后,我们就可以对集合对象本身使用 KVC 了。但是如果我们还实现额外规定的集合存取方法,我们可以得到更多好处:

  • 用 NSArray 或 NSSet 之外的类为 to-many relationships 建模。
  • 改变 to-many relationships 时性能更好。
  • 提供 Key-Value observing compliant 访问你对象的集合属性的内容。

额外规定的集合存取方法如下:

  • Accessing Indexed Collections

    • Indexed Collection Getters

      • countOf<Key>
      • objectIn<Key>AtIndex: or <key>AtIndexes:
      • (可选)get<Key>:range:
    • Indexed Collection Mutators

      • insertObject:in<Key>AtIndex: or insert<Key>:atIndexes:
      • removeObjectFrom<Key>AtIndex: or remove<Key>AtIndexes:
      • (可选)replaceObjectIn<Key>AtIndex:withObject: or replace<Key>AtIndexes:with<Key>:
  • Accessing Unordered Collections

    • Unordered Collection Getters

      • countOf<Key>
      • enumeratorOf<Key>
      • memberOf<Key>:
    • Unordered Collection Mutators

      • add<Key>Object: or add<Key>:
      • remove<Key>Object: or remove<Key>:
      • (可选)intersect<Key>:
继续阅读

(翻译)iOS 设计模式

iOS 设计模式–你也许听说过这个术语,但是你知道它意味着什么吗?尽管大多数开发者可能同意设计模式非常重要,但关于它的文章并不多,咱们开发者们写代码时并没有花太多注意力放到设计模式上。

在软件设计中设计模式是常见问题的可复用的解决方法。他们被设计成模板帮助你写出容易理解和复用的代码。他们也帮助你写出低藕合的代码以便你不需要太多争论就能改变或替换你代码的组件。

如果你刚刚接触设计模式,告诉你些好消息!首先,你已经使用过很多设计模式,这得感谢Cocoa 建立的方式以及你被鼓励使用的最佳实践。其次,这篇教程将让你掌握 iOS 的主要(次要)设计模式,它们在 Cocoa 中很常用。

教程分成多个部分,每部分包含一种设计模式。在每部分,你会看到如下顺序的解释:

  • 该设计模式是什么;
  • 你为什么应该使用它;
  • 如何使用它,以及什么场景合适,使用时需要留意的常见陷阱;

这篇教程中,你将创建一个 Music Library 应用,它会显示你的专辑和它们相关的信息。

在开发应用的过程中,你会慢慢熟悉多数常见的 Cocoa 设计模式:

  • 构造类:单例(Singleton)和 抽象工厂(Abstract Factory);
  • 架构类:模型-视图-控制器(MVC), 修饰(Decorator), 适配器(Adapter), 门面(Facade)和合成(Composite);
  • 行为类:观察者(Observer), 记忆(Memento), 响应链(Chain of Responsibility)和命令(Command)。

别被误导认为这是篇纯理论的文章;你会在你音乐应用中使用这些应用模式中的大多数。你的应用最终看起来像这样:

继续阅读