某些场景下,保持实例对象仅有一份是很有意义的。举个例子,你的应用实例(UIApplication),应该只有一个吧,
显然是指你的当前应用。还有一个例子:设备的屏幕(UIScreen)实例也是这样,所以对于这些类的情况,你只想要
一个实例对象。
单例模式的应用还有另一种情况:你需要一个全局类来处理配置文件。我们很容易通过单例模式实现线程安全的实例
访问,而如果有多个类可以同时访问配置文件,那可就复杂多了。
如何使用单例模式如何使用单例模式
可以看下这个图:
这是一个日志类,有一个属性(即一个单例对象)和两个方法:sharedInstance()和init()。
第一次调用sharedInstance()的时候,instance属性还没有初始化。所以我们要创建一个新实例并且返回。
下一次你再调用sharedInstance()的时候,instance已经初始化完成,直接返回即可。这个逻辑确保了这个类只存在一
个实例对象。
接下来我们继续完善单例模式,通过这个类来管理专辑数据。
注意到在我们前面的截图里,分组中有个API分组,这里可以放那些提供后台服务的类。在这个分组中创建一个新的文
件LibraryAPI.swift,继承自NSObject类。
在LibraryAPI里添加下面这段代码:
在这几行代码里,做了如下工作:
创建一个计算类型的类变量,这个类变量,就像是objc中的静态方法一样,可以直接通过类访问而不用实例对
象。具体可参见苹果官方文档的属性(Properties)这一章。
在类变量里嵌套一个Singleton结构体。
Singleton封装了一个静态的常量,通过 static 定义意味着这个属性只存在一个,注意Swift中static的变量是延时
加载的,意味着Instance直到需要的时候才会被创建。同时再注意一下,因为它是一个常量,所以一旦创建之后
不会再创建第二次。这些就是单例模式的核心所在:一旦初始化完成,当前类存在一个实例对象,初始化方法就
不会再被调用。
返回计算后的属性值。
【注意】更多的单例模式实例可以看看Github上的这个示例,列举了单例模式的若干种实现方式。
你现在可以将这个单例作为专辑管理类的入口,接下来我们继续创建一个处理专辑数据持久化的类。
新建 PersistencyManager.swift 并添加如下代码:
在这里我们定义了一个私有属性,用来存储专辑数据。这是一个可变数组,所以你可以很容易的增加或者删除数据。
然后加上一些初始化的数据: