備忘錄(Memento)模式
備忘錄模式快照對象的內部狀態並將其保存到外部。換句話說,它將狀態保存到某處,過會你可以不破壞封裝的情況下恢復對象的狀態,也就是說原來對象中的私有數據仍然是私有的。
如何使用備忘錄模式
在ViewController.m中增加下面的方法:
Objective-c代碼
- (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提供的保存應用設置信息和數據的地方。
loadPreviousState 加載之前保存的索引。這裡其實不是備忘錄模式完整的實現,但是你已經了解到它了。
現在,在ViewController.m的viewDidLoad方法中,在scroller初始化之前增加下面的代碼:
Objective-c代碼
[self loadPreviousState];
它將在應用啟動的時候加載原先保存的狀態。但是在什麼時候來保存應用的狀態呢?你將使用通知來實現它。當應用進入後台的時候,IOS會發送UIApplicationDidEnterBackgroundNotification通知,你可以使用這個通知去保存狀態,這是不是很方便?
在viewDidLoad中增加下面的代碼:
Objective-c代碼
[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];
現在,當應用進入後台的時候,ViewController將通過saveCurrentState方法自動保存當前的狀態。
現在增加下面的代碼:
Objective-c代碼
- (void)dealloc
{
[[NSNotificationCenterdefaultCenter] removeObserver:self];
}
這將確保當ViewController被銷毀的時候移除觀察者。
構建和運行你的應用,導航到一個專輯,然後通過Command+Shift+H(模擬器的情況下)將app發送到後台,然後關閉app。再一次打開app,檢查原先選擇的專輯是不是被顯示在中間:
看起來專輯數據是正確的,但是中間的視圖卻沒有顯示正確的專輯。出了什麼情況?這是可選方法initialViewIndexForHorizontalScroller的目的所在。因為這個方法沒有在委托中實現,這樣的話初始化視圖總是第一個視圖。
為了修正這個問題,在ViewController.m中增加下面的代碼:
Objective-c代碼
- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
{
return currentAlbumIndex;
}
現在HorizontalScroller的第一個視圖終於設置為了currentAlbumIndex指定的視圖。這使得app在下次使用的時候還保留了上次使用的狀態。