iOS Persistence and Core Data L2- Udacity的筆記
筆記目錄:
1.保存數據的基礎知識
2.如何使用NSCoder/NSKeyedArchiver保存數據(所在章節)
3.Core Data的使用
4.Core Data的構建
5.Core Data的框架
以上文章的簡介:我的女朋友CoreData和她閨蜜們
NSCoder/NSKeyedArchiver
前言
這是Lesson 2,這一課將主要介紹如何利用NSCoder/NSKeyedArchiver將一個包含對象(object)的數組或者字典,保存到Document/
目錄下。
保存一個包含對象的數組
假設有一個數組(NSArray)objects
包含著NSData
對象。對象圖(object graph)如圖
為了保存全部數據,我們需要做這樣的步驟:
1.創建指向
Document/
目錄的路徑(path)2.使用恰當的類來將整個數組(array)保存到
步驟1
創建的路徑(path)下
創建路徑
可以通過定義如下這樣的compute propertityactorsFilePath
來返回指向Document/
目錄的路徑(path)
var actorsFilePath : String {
let manager = NSFileManager.defaultManager()
let url = manager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as! NSURL
return url.URLByAppendingPathComponent("objectsArray").path!
}
NSKeyedArchiver
可以用這個類將整個對象圖(object graph)保存到Document/
目錄下。
永這個類很簡單,只需如下一行代碼就能將數組objects
保存到相應的文件中。
NSKeyedArchiver.archiveRootObject(objects, toFile: actorsFilePath)
然后取回數值
if let array = NSKeyedUnarchiver.unarchiveObjectWithFile(actorsFilePath) as? [NSData] {
objects = array
}
KeyedArchiver能夠保存這些類型的對象:NSArray, NSDictionary, NSDate, NSNumber, NSString, and NSData.
NSCoding
如果上面的那些類型不能滿足要求。則可以通過使用Protocol NSCoding
來自定義自己喜歡類型的對象,例如下面的例子Person
NSCoding是protocol。
提供下兩個有用的method:
- encodeWithCoder(:)
- init(coder:)
將要保存的類擴展 為NSObject(Nobody really gave this much thought when they were archiving Objective-C classes. But now it seems a little strange. It is possible that this will go away at some point.)
并使用NSCoding protocol。
例如:定義一個類Person
class Person : NSObject, NSCoding {
struct Keys {
static let Name = "name"
static let ProfilePath = "profile_path"
static let Movies = "movies"
static let ID = "id"
}
var name = ""
var id = 0
var imagePath = ""
var movies = [Movie]()
init(dictionary: [String : AnyObject]) {
name = dictionary[Keys.Name] as! String
id = dictionary[TheMovieDB.Keys.ID] as! Int
if let pathForImgage = dictionary[Keys.ProfilePath] as? String {
imagePath = pathForImgage
}
}
var image: UIImage? {
get {
return TheMovieDB.Caches.imageCache.imageWithIdentifier(imagePath)
}
set {
TheMovieDB.Caches.imageCache.storeImage(image, withIdentifier: imagePath)
}
}
// MARK: - NSCoding
func encodeWithCoder(archiver: NSCoder) {
// archive the information inside the Person, one property at a time
archiver.encodeObject(name, forKey: Keys.Name)
archiver.encodeObject(id, forKey: Keys.ID)
archiver.encodeObject(imagePath, forKey: Keys.ProfilePath)
archiver.encodeObject(movies, forKey: Keys.Movies)
}
required init(coder unarchiver: NSCoder) {
super.init()
// Unarchive the data, one property at a time
name = unarchiver.decodeObjectForKey(Keys.Name) as! String
id = unarchiver.decodeObjectForKey(Keys.ID) as! Int
imagePath = unarchiver.decodeObjectForKey(Keys.ProfilePath) as! String
movies = unarchiver.decodeObjectForKey(Keys.Movies) as! [Movie]
}
}
下一章節將開始,教保存Object的另一種常用方法Core Data。Core Data比NSCoding多了不少特性,但是弄起來就相對蛋疼一點。下一章節Core Data的使用