亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

設計模式開發中的備忘錄模式在iOS應用開發中的運用實例

2020-07-26 03:24:14
字體:
來源:轉載
供稿:網友

何為備忘錄模式?

    在響應某些事件時,應用程序需要保存自身的狀態,比如當用戶保存文檔或程序退出時。例如,游戲退出之前,可能需要保存當前會話的狀態,如游戲等級、敵人數量、可用武器的種類等。游戲再次打開時,玩家可以從離開的地方接著玩。很多時候,保存程序的狀態真的不需要什么特別巧妙的方法。任何簡單有效的方法都可以,但是同時,保存信息應該只對原始程序有意義。原始程序應該是能夠解碼它所保存文檔中的信息的唯一實體。這就是備忘錄模式應用于游戲、文字處理等程序的軟件設計中的方式,這些程序需要保存當前上下文的復雜狀態的快照并在以后恢復。

    備忘錄模式:在不破壞封裝的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先的保存狀態。

何時使用備忘錄模式?

    當同時滿足以下兩個條件時,應當考慮使用這一模式:

    @:需要保存一個對象(或某部分)在某一個時刻的狀態,這樣以后就可以恢復到先前的狀態。

    @:用于獲取狀態的接口會暴漏實現的細節,需要將其隱藏起來。

如何使用備忘錄模式:
在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提供的保存應用設置信息和數據的地方。
loadPreviousState 加載之前保存的索引。這里其實不是備忘錄模式完整的實現,但是你已經了解到它了。
現在,在ViewController.m的viewDidLoad方法中,在scroller初始化之前增加下面的代碼:
復制代碼 代碼如下:

[self loadPreviousState];

它將在應用啟動的時候加載原先保存的狀態。但是在什么時候來保存應用的狀態呢?你將使用通知來實現它。當應用進入后臺的時候,IOS會發送UIApplicationDidEnterBackgroundNotification通知,你可以使用這個通知去保存狀態,這是不是很方便?
在viewDidLoad中增加下面的代碼:
復制代碼 代碼如下:

[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];

現在,當應用進入后臺的時候,ViewController將通過saveCurrentState方法自動保存當前的狀態。
現在增加下面的代碼:
復制代碼 代碼如下:

- (void)dealloc
 
{
 
    [[NSNotificationCenterdefaultCenter] removeObserver:self];
 
}

這將確保當ViewController被銷毀的時候移除觀察者。
構建和運行你的應用,導航到一個專輯,然后通過Command+Shift+H(模擬器的情況下)將app發送到后臺,然后關閉app。再一次打開app,檢查原先選擇的專輯是不是被顯示在中間:

2016330120926817.png (214×320)

看起來專輯數據是正確的,但是中間的視圖卻沒有顯示正確的專輯。出了什么情況?這是可選方法initialViewIndexForHorizontalScroller的目的所在。因為這個方法沒有在委托中實現,這樣的話初始化視圖總是第一個視圖。
為了修正這個問題,在ViewController.m中增加下面的代碼:

復制代碼 代碼如下:

- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
 
{
 
    return currentAlbumIndex;
 
}

現在HorizontalScroller的第一個視圖終于設置為了currentAlbumIndex指定的視圖。這使得app在下次使用的時候還保留了上次使用的狀態。
再一次運行你的app,和之前一樣滾動專輯,停止應用,重啟,確保上面的問題已經修復了:

2016330120950078.png (214×320)

如果你查看PersistencyManager的init方法,你將注意到專輯數據被硬編碼并且每次都要重新創建它們。但是更好的方式是創建專輯列表一次,然后存儲它們到一個文件,你怎么保存專輯數據到一個文件呢?
一個可選的方式就是循環Album的屬性,保存它們到一個plist文件中,當它們需要的時候再重新構建它們。這個不是一個最好的方式,因為你需要去編寫與每個類的屬性關聯的特定的代碼。舉例來說如果過會你要創建一個具有不同屬性的Movie類,保存和加載的代碼需要重新寫。
此外,你也不能保存每個類的私有變量,因為它們在外面的類中是不可見的。這正是蘋果創建了歸檔(Archiving)機制的原因。

Cocoa Touch框架中的備忘錄模式

    Cocoa Touch框架在歸檔、屬性列表序列化和核心數據中采用了備忘錄模式。Cocoa的歸檔是對對象及其屬性還有同其他對象間的關系進行編碼,形成一個文檔,該文檔既可以保存于文件系統,也可以在進程或網絡間傳送。對象與其他對象的關系被看做對象圖的網絡。歸檔過程把對象保存為一種與架構無關的字節流,保持對象的標識以及對象之間的關系。對象的類型也同數據一起保存。從字節流解碼出來的對象通常用與對象編碼時相同的類型進行實例化。
   如果想歸檔一個對象,很多時候我們是考慮保存程序的狀態。在模型-視圖-控制器范式中,程序的狀態通常由模型對象來進行維護。我們把模型對象編碼到文檔,然后再對其解碼讀回來。在運行時使用NSCoder對象進行編碼與解碼操作。NSCoder本身是個抽象類。蘋果公司建議通過NSCoder的具體類NSKeyArchiver和NSKeyedUnarchiver,使用基于鍵的歸檔技術。被編碼與解碼的對象必須遵守NSCoding協議并實現以下方法:

復制代碼 代碼如下:

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合影院在线| 久久久精品日本| 欧美国产精品va在线观看| 久久久久久久一区二区三区| xxxxx91麻豆| 亚洲第一av网| 亚洲天堂成人在线视频| 亚洲影院高清在线| 日韩在线观看电影| 欧美日韩福利视频| 亚洲激情视频网站| 欧美猛少妇色xxxxx| 国产一区二区三区直播精品电影| 青青精品视频播放| 日韩视频一区在线| 久久久国产一区二区三区| 欧美性极品少妇精品网站| 亚洲精品在线不卡| 国产欧美在线播放| 欧美性生活大片免费观看网址| 精品久久久av| 亚洲无限乱码一二三四麻| 日韩精品亚洲元码| 亚洲精品电影在线| 成人国产精品免费视频| 欧美成人精品一区| 中文字幕精品网| 97在线精品视频| 欧美日韩高清区| 亚洲人精品午夜在线观看| 国产精品美女www爽爽爽视频| 亚洲精品久久久久久久久久久久| 亚洲精品自拍偷拍| 精品国产区一区二区三区在线观看| 国产欧美一区二区| 人人澡人人澡人人看欧美| 国产经典一区二区| 亚洲久久久久久久久久久| 2018日韩中文字幕| 亚洲精品成人av| 欧美性受xxx| 久久久国产影院| 欧美视频裸体精品| 欧美成人精品一区二区三区| 国产精品美女无圣光视频| 97国产一区二区精品久久呦| 国产成人精品久久二区二区91| 日韩有码在线播放| 国产精品xxxxx| 国产日韩在线一区| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品一区av在线播放| 91久久久久久久久久久| 久久艹在线视频| 欧美成人精品一区二区三区| 国产成人av在线播放| 欧美另类第一页| 97碰在线观看| 51色欧美片视频在线观看| 亚洲欧美日韩一区在线| 国产精品一区专区欧美日韩| 欧美日韩国产成人在线观看| 国产高清视频一区三区| 国产精品高清免费在线观看| 国产视频999| 亚洲男人天堂手机在线| 亚洲国产精品免费| 亚洲视频欧洲视频| 成人午夜一级二级三级| 欧美视频在线免费看| 欧美另类高清videos| 狠狠色狠狠色综合日日五| 亚洲美女黄色片| 九九视频这里只有精品| 国产精品日日做人人爱| 91在线视频九色| 另类美女黄大片| 国产v综合v亚洲欧美久久| 日韩免费观看视频| 日韩精品在线观| 97成人在线视频| 欧美日韩亚洲国产一区| 日韩精品高清在线| 日韩在线欧美在线| 国产激情久久久久| 孩xxxx性bbbb欧美| 中国人与牲禽动交精品| 清纯唯美日韩制服另类| 欧美一二三视频| 日本久久久a级免费| 欧美激情亚洲精品| 亚洲乱码av中文一区二区| 日韩精品在线影院| 亚洲精品mp4| 欧美国产视频日韩| 最近2019年中文视频免费在线观看| 国产精品视频一区二区三区四| 国产成人综合精品在线| 国产精品久久久久久av福利| 久久亚洲电影天堂| 久久久久五月天| 最近中文字幕mv在线一区二区三区四区| 青青草国产精品一区二区| 主播福利视频一区| 色妞在线综合亚洲欧美| 亚洲成人三级在线| 在线看国产精品| 欧美日韩激情视频| 亚洲电影第1页| 日韩精品丝袜在线| 中文字幕国内精品| 国外成人在线视频| 91av在线免费观看视频| 亚洲网在线观看| **欧美日韩vr在线| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产精品中文| 国产欧美一区二区三区在线| 欧美日韩另类视频| 亚洲电影免费观看| 色婷婷av一区二区三区久久| 在线观看91久久久久久| 国产精品444| 日韩在线播放一区| 国内自拍欧美激情| 国产一区二区三区网站| 最近2019中文字幕大全第二页| 亚洲xxx自由成熟| 久久久人成影片一区二区三区观看| 亚洲国产精品久久精品怡红院| 日韩中文视频免费在线观看| 日韩亚洲欧美成人| 欧美日韩日本国产| 国产一区二区成人| 久热99视频在线观看| 久久亚洲精品视频| 91精品久久久久久久久久久久久| 性欧美xxxx交| 91精品久久久久久久久久久久久久| 91在线色戒在线| 久久久精品亚洲| 中文字幕久久精品| 综合136福利视频在线| 成人黄色免费网站在线观看| 精品久久久久久久久久| 精品一区二区三区四区在线| 欧美与黑人午夜性猛交久久久| 久久久91精品| 国产精品露脸自拍| 国产成人精品在线视频| 狠狠躁夜夜躁人人躁婷婷91| 7m第一福利500精品视频| 中文字幕在线看视频国产欧美| 成人h视频在线观看播放| 国产日韩av高清| 91国内揄拍国内精品对白| 日本最新高清不卡中文字幕| 亚洲无线码在线一区观看| 国产一区二区在线播放| 久久影视电视剧免费网站| 97精品在线视频| 日韩精品高清在线观看| 久久精品精品电影网| 一本一本久久a久久精品综合小说|