設計模式開發(fā)中的備忘錄模式在iOS應用開發(fā)中的運用實例
何為備忘錄模式?
在響應某些事件時,應用程序需要保存自身的狀態(tài),比如當用戶保存文檔或程序退出時。例如,游戲退出之前,可能需要保存當前會話的狀態(tài),如游戲等級、敵人數(shù)量、可用武器的種類等。游戲再次打開時,玩家可以從離開的地方接著玩。很多時候,保存程序的狀態(tài)真的不需要什么特別巧妙的方法。任何簡單有效的方法都可以,但是同時,保存信息應該只對原始程序有意義。原始程序應該是能夠解碼它所保存文檔中的信息的唯一實體。這就是備忘錄模式應用于游戲、文字處理等程序的軟件設計中的方式,這些程序需要保存當前上下文的復雜狀態(tài)的快照并在以后恢復。
備忘錄模式:在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到原先的保存狀態(tài)。
何時使用備忘錄模式?
當同時滿足以下兩個條件時,應當考慮使用這一模式:
@:需要保存一個對象(或某部分)在某一個時刻的狀態(tài),這樣以后就可以恢復到先前的狀態(tài)。
@:用于獲取狀態(tài)的接口會暴漏實現(xiàn)的細節(jié),需要將其隱藏起來。
如何使用備忘錄模式:
在ViewController.m中增加下面的方法:
- (void)saveCurrentState
{
// When the user leaves the app and then comes back again, he wants it to be in the exact same state
// he left it. In order to do this we need to save the currently displayed album.
// Since it's only one piece of information we can use NSUserDefaults.
[[NSUserDefaultsstandardUserDefaults] setInteger:currentAlbumIndex forKey:@"currentAlbumIndex"];
}
- (void)loadPreviousState
{
currentAlbumIndex = [[NSUserDefaultsstandardUserDefaults] integerForKey:@"currentAlbumIndex"];
[self showDataForAlbumAtIndex:currentAlbumIndex];
}
saveCurrentState 保存當前的專輯索引到NSUserDefaults,NSUserDefaults是IOS提供的保存應用設置信息和數(shù)據(jù)的地方。
loadPreviousState 加載之前保存的索引。這里其實不是備忘錄模式完整的實現(xiàn),但是你已經(jīng)了解到它了。
現(xiàn)在,在ViewController.m的viewDidLoad方法中,在scroller初始化之前增加下面的代碼:
[self loadPreviousState];
它將在應用啟動的時候加載原先保存的狀態(tài)。但是在什么時候來保存應用的狀態(tài)呢?你將使用通知來實現(xiàn)它。當應用進入后臺的時候,IOS會發(fā)送UIApplicationDidEnterBackgroundNotification通知,你可以使用這個通知去保存狀態(tài),這是不是很方便?
在viewDidLoad中增加下面的代碼:
[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];
現(xiàn)在,當應用進入后臺的時候,ViewController將通過saveCurrentState方法自動保存當前的狀態(tài)。
現(xiàn)在增加下面的代碼:
- (void)dealloc
{
[[NSNotificationCenterdefaultCenter] removeObserver:self];
}
這將確保當ViewController被銷毀的時候移除觀察者。
構建和運行你的應用,導航到一個專輯,然后通過Command+Shift+H(模擬器的情況下)將app發(fā)送到后臺,然后關閉app。再一次打開app,檢查原先選擇的專輯是不是被顯示在中間:
看起來專輯數(shù)據(jù)是正確的,但是中間的視圖卻沒有顯示正確的專輯。出了什么情況?這是可選方法initialViewIndexForHorizontalScroller的目的所在。因為這個方法沒有在委托中實現(xiàn),這樣的話初始化視圖總是第一個視圖。
為了修正這個問題,在ViewController.m中增加下面的代碼:
- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
{
return currentAlbumIndex;
}
現(xiàn)在HorizontalScroller的第一個視圖終于設置為了currentAlbumIndex指定的視圖。這使得app在下次使用的時候還保留了上次使用的狀態(tài)。
再一次運行你的app,和之前一樣滾動專輯,停止應用,重啟,確保上面的問題已經(jīng)修復了:
如果你查看PersistencyManager的init方法,你將注意到專輯數(shù)據(jù)被硬編碼并且每次都要重新創(chuàng)建它們。但是更好的方式是創(chuàng)建專輯列表一次,然后存儲它們到一個文件,你怎么保存專輯數(shù)據(jù)到一個文件呢?
一個可選的方式就是循環(huán)Album的屬性,保存它們到一個plist文件中,當它們需要的時候再重新構建它們。這個不是一個最好的方式,因為你需要去編寫與每個類的屬性關聯(lián)的特定的代碼。舉例來說如果過會你要創(chuàng)建一個具有不同屬性的Movie類,保存和加載的代碼需要重新寫。
此外,你也不能保存每個類的私有變量,因為它們在外面的類中是不可見的。這正是蘋果創(chuàng)建了歸檔(Archiving)機制的原因。
Cocoa Touch框架中的備忘錄模式
Cocoa Touch框架在歸檔、屬性列表序列化和核心數(shù)據(jù)中采用了備忘錄模式。Cocoa的歸檔是對對象及其屬性還有同其他對象間的關系進行編碼,形成一個文檔,該文檔既可以保存于文件系統(tǒng),也可以在進程或網(wǎng)絡間傳送。對象與其他對象的關系被看做對象圖的網(wǎng)絡。歸檔過程把對象保存為一種與架構無關的字節(jié)流,保持對象的標識以及對象之間的關系。對象的類型也同數(shù)據(jù)一起保存。從字節(jié)流解碼出來的對象通常用與對象編碼時相同的類型進行實例化。
如果想歸檔一個對象,很多時候我們是考慮保存程序的狀態(tài)。在模型-視圖-控制器范式中,程序的狀態(tài)通常由模型對象來進行維護。我們把模型對象編碼到文檔,然后再對其解碼讀回來。在運行時使用NSCoder對象進行編碼與解碼操作。NSCoder本身是個抽象類。蘋果公司建議通過NSCoder的具體類NSKeyArchiver和NSKeyedUnarchiver,使用基于鍵的歸檔技術。被編碼與解碼的對象必須遵守NSCoding協(xié)議并實現(xiàn)以下方法:
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
- iOS App設計模式開發(fā)中對interpreter解釋器模式的運用
- 詳解iOS App設計模式開發(fā)中對于享元模式的運用
- iOS App設計模式開發(fā)中對建造者模式的運用實例
- iOS App設計模式開發(fā)中對迭代器模式的使用示例
- iOS App的設計模式開發(fā)中對State狀態(tài)模式的運用
- 解析iOS應用開發(fā)中對設計模式中的抽象工廠模式的實現(xiàn)
- 詳解iOS應用開發(fā)中使用設計模式中的抽象工廠模式
- 實例解析設計模式中的外觀模式在iOS App開發(fā)中的運用
- 深入解析設計模式中的裝飾器模式在iOS應用開發(fā)中的實現(xiàn)
- 舉例講解設計模式中的原型模式在iOS應用開發(fā)中的作用
相關文章
實例解析設計模式中的外觀模式在iOS App開發(fā)中的運用
這篇文章主要介紹了設計模式中的外觀模式在iOS App開發(fā)中的運用,實例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-03-03iOS 隱私權限和通過openURL實現(xiàn)跳轉(zhuǎn)實例
這篇文章主要介紹了iOS 隱私權限和通過openURL實現(xiàn)跳轉(zhuǎn)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Flutter之PageView頁面緩存與KeepAlive
這篇文章主要為大家介紹了Flutter之PageView頁面緩存與KeepAlive示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10iOS開發(fā)教程之UIRefreshControl使用的踩坑指南
UIRefreshControl是iOS6自帶的UITableView下拉刷新控件。下面這篇文章主要給大家介紹了關于iOS開發(fā)教程之UIRefreshControl使用的踩坑指南,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2018-04-04iOS開發(fā)中控制屏幕旋轉(zhuǎn)的編寫方法小結
這篇文章主要介紹了iOS開發(fā)中控制屏幕旋轉(zhuǎn)的編寫方法小結,包括橫豎屏切換時視圖所出現(xiàn)的問題等經(jīng)常需要注意的地方,需要的朋友可以參考下2015-10-10