iOS Persistence and Core Data Lesson 1- Udacity的筆記
筆記目錄:
1.保存數(shù)據(jù)的基礎(chǔ)知識(shí)(所在章節(jié))
2.如何使用NSCoder/NSKeyedArchiver保存數(shù)據(jù)
3.Core Data的使用
4.Core Data的構(gòu)建
5.Core Data的框架
各文章的介紹:我的女朋友CoreData和她閨蜜們
前言
通過(guò)將數(shù)據(jù)緩存在本地,可以有效減少http請(qǐng)求數(shù),和提升用戶體驗(yàn)。
本文章要解決的問(wèn)題:
要保存數(shù)據(jù)。
1.首先要知道什么時(shí)候保存恰當(dāng)?
2.然后要知道怎么保存?即是用什么類(class)和方法(method)?
App Life Cycle
要了解iOS如何將數(shù)據(jù)存在本地,先來(lái)了解一個(gè)App的生命周期(App Life Cycle).
一個(gè)App的狀態(tài)
或者你已經(jīng)注意到了,App有兩個(gè)表示正在運(yùn)行的狀態(tài)(state)
- Active.這狀態(tài)(state) 表示app正在遠(yuǎn)行,并且占據(jù)控制整個(gè)屏幕。
- Background.這狀態(tài)表示app正在運(yùn)行,但是沒有占據(jù)控制整個(gè)屏幕。例如:我們打開微信回復(fù)微信,并且使用網(wǎng)易云音樂聽歌。其中網(wǎng)易云音樂就是處于Backgruond.
當(dāng)然,除了表示正在運(yùn)行的狀態(tài),也有表示不在遠(yuǎn)行的狀態(tài)(state)
- Not Running.表示這個(gè)App還沒有打開過(guò)。
- Inactive.表示這個(gè)App曾經(jīng)打開過(guò)并且運(yùn)行的,但遇到user(用戶)按下了home鍵,或者是收到了電話。
如下,第五的狀態(tài)是很少見到的。
- Suspended.表示App 可在后臺(tái)(background)運(yùn)行,但是沒有做任何事情。
這些狀態(tài)的轉(zhuǎn)換都會(huì)作為app生命周期事件(app lifecycle event)傳遞給AppDelegate.
Life Cycle Method
狀態(tài)轉(zhuǎn)換是通過(guò)Delegate通知AppDelegated,其中管理狀態(tài)轉(zhuǎn)換(Managing State Transitions)的Delegate method,如下:
以下兩個(gè)method是,Not Running 轉(zhuǎn) Active 狀態(tài)
- application(_:willFinishLaunchingWithOptions:)
- application(_:didFinishLaunchingWithOptions:)
以下這method是任一 state 轉(zhuǎn)為 Active狀態(tài)
- applicationDidBecomeActive(_:)
- applicationWillResignActive(_:)
以下method如其名字所說(shuō)
- applicationDidEnterBackground(_:)
- applicationWillEnterForeground(_:)
這method是轉(zhuǎn)為Not running時(shí)
- applicationWillTerminate(_:)
例子
將上面AppDelegate的method中加入相應(yīng)print語(yǔ)句觀察狀態(tài)轉(zhuǎn)換。
按照相應(yīng)gif的操作,在終端有如下輸出:
第一次啟動(dòng)時(shí)

App Delegate: will finish launching
App Delegate: did finish launching
App Delegate: did become active
按下home鍵時(shí)

App Delegate: will resign active
App Delegate: did enter background
按下app按鈕回到Foreground時(shí)

App Delegate: will enter foreground
App Delegate: did become active
lock的時(shí)候

App Delegate: will resign active
App Delegate: did enter background
解鎖的時(shí)候

App Delegate: will enter foreground
App Delegate: did become active
雙機(jī)home鍵然后向上滑動(dòng)結(jié)束app

App Delegate: will terminate
也可以是App Delegate: did enter background.
關(guān)鍵是看app是否支持background 執(zhí)行.
保存數(shù)值的類和方法
了解完一個(gè)app的state轉(zhuǎn)換。然后就到用什么類了。
其它更多特性的類和方法,留在以后章節(jié)介紹。
這里是使用比較簡(jiǎn)單的類。能用它保存用戶設(shè)定的值
NSUserDefaults 保存值
用NSUserDefaults保存數(shù)值
NSUserDefaults.standardUserDefaults().defaults.setFloat(22.5 forKey: “myValue”)
用NSUserDefaults取回?cái)?shù)值
let value = NSUserDefaults.standardUserDefaults().floatForKey(“myValue”)
保存文件
app文件保存目錄
每個(gè)app都是獨(dú)立的。沙盒結(jié)構(gòu)。
app目錄

Documents/目錄
這里保存著user可以訪問(wèn)的files,面向user的files。Library/Application support/目錄
通常來(lái)說(shuō),這目錄保存這一個(gè)app運(yùn)行需要的file,但是對(duì)user隱藏。Documents/andApplication Support/目錄
默認(rèn)是自動(dòng)備份的tmp/目錄
系統(tǒng)會(huì)清除里面的數(shù)據(jù),當(dāng)app不再運(yùn)行時(shí)。Library/Caches/目錄
這目錄下的數(shù)據(jù)比tmp/目錄下的數(shù)據(jù)活得舊一點(diǎn),但是相比Support/目錄下活得短一點(diǎn)
因?yàn)橄到y(tǒng)會(huì)刪除Caches/來(lái)解放存儲(chǔ)空間。所以這些數(shù)據(jù)file應(yīng)該可以是重新獲取的。
建立FilePath
let filename = "usersVoice.wav"
let dirPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String
let pathArray = [dirPath, filename]
let fileURL = NSURL.fileURLWithPathComponents(pathArray)!
用NSFileManager檢查文件是否存在
if NSFileManager.defaultManager().fileExistsAtPath(audioFileURL().path!) {
shouldSegueToSoundPlayer = true
}
本章節(jié)是是使用NSDefault 保存數(shù)值,下一章節(jié)如何使用NSCoder/NSKeyedArchiver保存數(shù)據(jù),介紹如何保存復(fù)雜的Object