平時(shí)我們經(jīng)常會(huì)采用 NSUserDefaults 或者 Plist 來(lái)存儲(chǔ)數(shù)據(jù)到設(shè)備侮叮,這樣即使 App 被關(guān)閉姿搜,下次再打開(kāi)的時(shí)候數(shù)據(jù)還在笤昨。這里我寫(xiě)了兩個(gè)函數(shù)來(lái)供大家使用,一個(gè)用來(lái)存數(shù)據(jù)停士,一個(gè)用來(lái)讀數(shù)據(jù)挖帘。
// MARK: - Store
enum StoreType {
case userDefaults
case plist
}
func setContentToDevice (content:AnyObject, key:String, type:StoreType) {
if type == .userDefaults {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(content, forKey: key)
print("Set - UserDefaults")
}else if type == .plist {
let pathPrefix = NSSearchPathForDirectoriesInDomains(
NSSearchPathDirectory.DocumentDirectory,
NSSearchPathDomainMask.AllDomainsMask, true).first
let pathSuffix = "/" + key + ".plist"
if let path = pathPrefix?.stringByAppendingString(pathSuffix) {
NSKeyedArchiver.archiveRootObject(content, toFile: path)
print("Set - Plist")
}
}
}
func getContentFromDevice (key:String, type:StoreType) -> AnyObject? {
var returnObject :AnyObject?
if type == .userDefaults {
let defaults = NSUserDefaults.standardUserDefaults()
let content = defaults.objectForKey(key)
returnObject = content
print("Get - UserDefaults")
}else if type == .plist {
let pathPrefix = NSSearchPathForDirectoriesInDomains(
NSSearchPathDirectory.DocumentDirectory,
NSSearchPathDomainMask.AllDomainsMask, true).first
let pathSuffix = "/" + key + ".plist"
if let path = pathPrefix?.stringByAppendingString(pathSuffix) {
if let content = NSKeyedUnarchiver.unarchiveObjectWithFile(path) {
returnObject = content
print("Get - Plist")
}
}
}
return returnObject
}
函數(shù)名和參數(shù)名都一看便知是什么意思,只要你存取數(shù)據(jù)都用的是同一個(gè) Key恋技,就可以操作同一份數(shù)據(jù)拇舀。
這里多提供了一個(gè) type 選項(xiàng)來(lái)選擇通過(guò) NSUserDefaults 或者 Plist 來(lái)存儲(chǔ)數(shù)據(jù)。但是要注意蜻底,在這里 NSUserDefaults 只支持存儲(chǔ) NSArray骄崩、NSString 等基本類(lèi)型,如果你要存儲(chǔ)自定義類(lèi)型的實(shí)例朱躺,必須使用 StoreType.plist 進(jìn)行存儲(chǔ)刁赖。此外搁痛,這個(gè)類(lèi)還必須進(jìn)行微小的改動(dòng)长搀,這部分可以參考我之前寫(xiě)的一篇文章。
下面給出使用這個(gè)函數(shù)的范例:(其中 Hero 是我自定義的類(lèi))
let arr = [1,2,3,4,5]
setContentToDevice(arr, key: "testArr", type: .userDefaults)
let ironMan = Hero(name: "Tony Stark")
setContentToDevice(ironMan, key: "testHero", type: .plist)
if let result = getContentFromDevice("testArr", type: .userDefaults) {
print(result)
}
if let result = getContentFromDevice("testHero", type: .plist) as? Hero {
print(result.name)
}
控制臺(tái)輸出
防止有人懶得看我之前寫(xiě)的那篇文章鸡典,把 Hero Class 這部分代碼也貼出來(lái)
import UIKit
class Hero: NSObject {
var name:String
init(name:String) {
self.name = name
super.init()
}
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeObject(name, forKey: "name")
}
init(coder aDecoder: NSCoder!) {
self.name = aDecoder.decodeObjectForKey("name") as! String
}
}