iOS中数据持久化有plist,NSUserDefualt,SQLData和Core Data几种方式。本文结合上一篇Swift单例模式Singleton pattern的实现来创建一个基于plist的数据持久化单例。
plist储存入门
属性列表(plist)是一种XML文件,Foundation框架中数组和字典等都可以与plist文件相互转换。比如下文就是一个标准的plist文件,保存了一组array["衣带渐宽终不悔","为伊消得人憔悴","故国不堪回首明月中","人生若只如初见","暮然回首,那人却在灯火阑珊处"]
1 2 3 4 5 6 7 8 9 10 11
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> <string>衣带渐宽终不悔</string> <string>为伊消得人憔悴</string> <string>故国不堪回首明月中</string> <string>人生若只如初见</string> <string>暮然回首,那人却在灯火阑珊处</string> </array> </plist>
|
数据写入plist
可以通过一下函数把一组数组写入plist,写入plist后就算退出数据也会保存,直到手动删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| func saveWithFile() { let home = NSHomeDirectory() as NSString; let docPath = home.stringByAppendingPathComponent("Documents") as NSString; let filePath = docPath.stringByAppendingPathComponent("data2.plist"); var dataSource = NSMutableArray(); dataSource.addObject("衣带渐宽终不悔"); dataSource.addObject("为伊消得人憔悴"); dataSource.addObject("故国不堪回首明月中"); dataSource.addObject("人生若只如初见"); dataSource.addObject("暮然回首,那人却在灯火阑珊处"); dataSource.writeToFile(filePath, atomically: true); println("\(filePath)"); }
|
读取plist
不管写入还是读取,都要先获取软件本身的沙盒路径,再从路径中找出具体文件的路径,从而进行读写。
1 2 3 4 5 6 7 8 9 10
| func readWithFile() { let home = NSHomeDirectory() as NSString; let docPath = home.stringByAppendingPathComponent("Documents") as NSString; let filePath = docPath.stringByAppendingPathComponent("data.plist"); let dataSource = NSArray(contentsOfFile: filePath); println("\(dataSource)"); }
|
FileManager 单例创建
创建单例
按照Swift单例模式Singleton pattern的实现第三种方法,创建数据管理单例。
1 2 3 4 5 6 7
| private let _SingletonASharedInstance = DataManager()
class DataManager { class var sharedInstance : DataManager { return _SingletonASharedInstance } }
|
重构代码
不管读取还是写入,都有一个重复的过程就是获取文件路径,所以重构代码为如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import Foundation
private let _SingletonASharedInstance = DataManager()
class DataManager { class var sharedInstance : DataManager { return _SingletonASharedInstance } func filePath(filename: String) -> String { var mypaths:NSArray = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) var mydocpath:String = mypaths.objectAtIndex(0) as! String var filepath = mydocpath.stringByAppendingPathComponent(filename) return filepath } func saveWithFile() { let filePath = self.filePath("data.plist") var dataSource = NSMutableArray() dataSource.writeToFile(filePath, atomically: true) println("\(filePath)") } func appendData(newData:String) { var filename = self.filePath("data.plist") let dataSource = NSArray(contentsOfFile: filename as String) as! NSMutableArray dataSource.addObject(newData) dataSource.writeToFile(filename as String, atomically: true) } func readWithFile() { let filePath = self.filePath("data.plist") let dataSource = NSArray(contentsOfFile: filePath) println("\(dataSource)") } func deleleWithFile() { let filePath = self.filePath("data.plist") let dataSource:NSMutableArray = [] dataSource.writeToFile(filePath, atomically: true) } }
|
用法
1 2 3
| DataManager.sharedInstance.appendData("string~~") DataManager.sharedInstance.readWithFile() DataManager.sharedInstance.deleleWithFile()
|
参考