版权声明:原创作品,谢绝转载!否则将追究法律责任。

备忘录模式捕获和具体化对象的内部状态。换句话说,它可以节省你的东西后来,这种外部状态可以恢复在不违反封装;

也就是说,私人数据是私有的。

怎么用备忘录设计模式

在Viewcontroller的实现文件里添加下面方法:

- (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.

[[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@"currentAlbumIndex"];

}

- (void)loadPreviousState

{

currentAlbumIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"currentAlbumIndex"];

[self showDataForAlbumAtIndex:currentAlbumIndex];

}

saveCurrentState 保存了这个当前专辑的索引用NSUserDefaults 他是一个苹果提供的标准的存储应用设置和数据的。

loadPreviousState 加载之前保存的索引。这不是备忘录设计模式的完全实现。

现在添加代码在滑动视图初始化前面:

[self loadPreviousState];

应用程序启动时加载以前保存的状态,但是你保存应用当前转台只是为了加载?你将要用通知做这件事。当应用进入到后台系统发送

UIApplicationDidEnterBackgroundNotification。你可以用这个通知调用saveCurrentState。这不是很方面吗?

在ViewDidLoad添加下面代码:

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

现在这个应用进入到后台。将要自动的调用saveCurrentState方法来保存当前状态。

现在添加下面代码:

- (void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

这个保证你Viewcontroller销毁的时候移除这个类注册的观察者。

构建和运行您的应用程序。导航到一个专辑,将应用程序发送到后台使用命令+ Shift + H(如果你是在模拟器),然后关闭应用程序,重新启动,并检查之前,选择专辑为中心:

看起来你的专辑数据是正确的。但是你的滑动视图没有在中间这是怎么了?

这就是上面可选协议方法的意义

initialViewIndexForHorizontalScroller:因为这个方法在代理类里面没有实现。在这个例子代理类就是Viewcontroller,因此初始视图一直被设置为第一个视图。

为了修正他在Viewcontroller的实现文件里面添加下面代码:

- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller

{

return currentAlbumIndex;

}

现在这个滑动视图的第一个视图可以设置为任何专辑是由

currentAlbumIndex表明的。这是一个很好的方法来确保你的应用体验来维持私有和可恢复的。

如果你看看PersistencyManager的init,你将要注意到这个专辑数据是硬件编码并且PersistencyManager创建的时候都会重新创建。最好的解决方法是一旦创建专辑列表就把他们存储到一个文件。那么怎么把专辑存储到文件呢?

一种方法是迭代专辑的属性,保存他们到一个plist文件并且然后创建专辑的实例一旦需要的时候。但是这不是最佳选择,由于需要你编写特定的代码依靠每个类的属性和数据。例如你接下来创建的movies类有不同的属性,保存和加载数据需要新的代码。

此外,你不能保存每个类的实例的私有变量,因为他们无法访问外部类。这就是为什么苹果公司创建归档机制。

归档

苹果的一个专门记忆模式的实现是归档。把一个对象转化为流便于保存和恢复不用向外部类暴露私有的属性。你可以参考Apple’s Archives and Serializations Programming Guide.

那么怎么用归档呢?

首先你需要声明专辑通过符合NSCoding协议是可以归档的。在专辑头文件写上符合NSCoding协议:

@interface Album : NSObject <NSCoding>

在实现文件里面:

添加两个方法:

- (void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder encodeObject:self.year forKey:@"year"];

[aCoder encodeObject:self.title forKey:@"album"];

[aCoder encodeObject:self.artist forKey:@"artist"];

[aCoder encodeObject:self.coverUrl forKey:@"cover_url"];

[aCoder encodeObject:self.genre forKey:@"genre"];

}

- (id)initWithCoder:(NSCoder *)aDecoder

{

self = [super init];

if (self)

{

_year = [aDecoder decodeObjectForKey:@"year"];

_title = [aDecoder decodeObjectForKey:@"album"];

_artist = [aDecoder decodeObjectForKey:@"artist"];

_coverUrl = [aDecoder decodeObjectForKey:@"cover_url"];

_genre = [aDecoder decodeObjectForKey:@"genre"];

}

return self;

}

你调用encodeWithCoder:当你归档你类的一个实例时候,

相反地的当你解档一个实例来创建一个专辑的实例。看着简单而且强大。现在专辑类可以被归档了。

添加的代码实际上保存和加载相册的列表。

添加以下签名(或方法原型)PersistencyManager.h:

这将是叫的方法保存相册。

现在,添加PersistencyManager.m方法实现:

- (void)saveAlbums

{

NSString *filename = [NSHomeDirectory() stringByAppendingString:@"/Documents/albums.bin"];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:albums];

[data writeToFile:filename atomically:YES];

}

NSKeyedArchiver档案专辑数组名为albums.bin的文件。

当你归档对象包含其他对象,

归档器会自动的迭代归档子对象并且孩子的任何子对象。

在此情况下开始对专辑类归档,这是专辑实例的一个数组,因此数组和专辑都支持NSCoding接口。任何在数组里面的东西都会被归档。

现在在

PersistencyManager.m init方法里添加下面代码:

- (id)init

{

self = [super init];

if (self) {

NSData *data = [NSData dataWithContentsOfFile:[NSHomeDirectory() stringByAppendingString:@"/Documents/albums.bin"]];

albums = [NSKeyedUnarchiver unarchiveObjectWithData:data];

if (albums == nil)

{

albums = [NSMutableArray arrayWithArray:

@[[[Album alloc] initWithTitle:@"Best of Bowie" artist:@"David Bowie" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_david%20bowie_best%20of%20bowie.png" year:@"1992"],

[[Album alloc] initWithTitle:@"It's My Life" artist:@"No Doubt" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_no%20doubt_its%20my%20life%20%20bathwater.png" year:@"2003"],

[[Album alloc] initWithTitle:@"Nothing Like The Sun" artist:@"Sting" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_sting_nothing%20like%20the%20sun.png" year:@"1999"],

[[Album alloc] initWithTitle:@"Staring at the Sun" artist:@"U2" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_u2_staring%20at%20the%20sun.png" year:@"2000"],

[[Album alloc] initWithTitle:@"American Pie" artist:@"Madonna" coverUrl:@"http://www.coversproject.com/static/thumbs/album/album_madonna_american%20pie.png" year:@"2000"]]];

[self saveAlbums];

}

}

return self;

}

在新的代码里,

NSKeyedUnarchiver 从文件里面加载新的专辑数据,如果他存在。如果他不存在,

立即创建相册数据和保存它在下次加载应用程序。

你还想保存这张专辑每次应用程序进入后台数据。

这可能不是必要的,但如果你后来添加的选项更改相册数据

那么你想要确保您已经保存了所有更改。

添加以下LibraryAPI.h方法签名:

- (void)saveAlbums;

应用通过libraryAPI访问所有的服务,这就是应用怎么让PersitencyManager 知道他需要保存专辑的数据。

现在添加这个方法实现到libraryAPI实现文件里:

- (void)saveAlbums

{

[persistencyManager saveAlbums];

}

这段代码仅仅通过在调用LibraryAPI保存相册到PersistencyMangaer

。和上面的代码使用LibraryAPI触发保存专辑的数据每当Viewcontroller保存其状态。

编译运行你的应用检查是不是所有东西运行正常。

不幸的是,没有简单的方法来检查数据持久性是正确的。幸运的是你可以在finder里检查模拟器的document文件夹看专辑的数据文件是不是被创建,但是为了检查是不是有改变你不得不添加改变专辑数据的功能。

但是代替改变数据,如果你添加一个选项来删除你的专辑当你不想要的时候。此外你应该有一个撤销的选项一旦你误删了专辑。

这是我们下面介绍的一个设计模式命令设计模式。

IOS设计模式第九篇之备忘录模式的更多相关文章

  1. [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向

    老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...

  2. Java设计模式(15)备忘录模式(Memento模式)

    Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...

  3. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  4. Head First 设计模式系列之二----备忘录模式(java版)

    申明:这几天无意中关注到备忘录模式,比较陌生回家一番参考书,只在附录里记录了该模式.后来在园子里有发现了有专门写设计模式的博客,并且写的也得牛逼.附上链接 http://www.cnblogs.com ...

  5. Java设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  6. 设计模式20:Memento 备忘录模式(行为型模式)

    Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某 ...

  7. 【设计模式 - 18】之备忘录模式(Memento)

    1      模式简介 备忘录模式的定义: 备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象,用作"后悔药",即取消上次操作或返回到以前的某个版本. 备忘录模式的应用实例 ...

  8. 设计模式 --> (13)备忘录模式

    备忘录模式 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态 示例 玩游戏时都会保存进度,所保存的进度以文件的形式存在.这样下次就可 ...

  9. Java设计模式(十) 备忘录模式 状态模式

    (十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(Stri ...

随机推荐

  1. unity-------------------Unity5.X 新版AssetBundle使用方案及策略

    Unity5.X 新版AssetBundle使用方案及策略   1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使 ...

  2. unity-----------------------------关于WheelCollider设置或小车运动的注意事项

    转载:Unity3d 汽车物理引擎 WheelCollider总结   WheelCollider总结 写了前面两篇文章,我想总结一下WheelCollider! 让我们能够更清晰的学会物理车的开发! ...

  3. WinForm控件学习笔记【第一天】——Control类

    感悟:明天就又是学校双选会的日子了.两年我都参与了学校的双选会的服务工作,现在该是双选会服务的我时候了.怎么样找到一份好的工作,或者说怎么样学习才能符合企业对人才的要求,我现在也是很迷茫.平时都是在看 ...

  4. ubuntu14.04安装好用的google拼音输入法

    装了ubuntu14.04后感觉自带的拼音输入法不好用的有没有,有些字拼不出来有没有...,其实我们安装google拼音输入发就会好很多... 方法/步骤     安装google拼音输入法 $sud ...

  5. 面向切面编程(AOP)简介

    在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理几乎是所有软件都需要的.他们是否可以主动的参与呢,如果让应用程序只关注与自己所针对的业务领域问题,而其他的问题有其他应用对象来处理.是否 ...

  6. iOS:根据系统类型加载不同的xib

    1.将 xib 文件名手动更改为 xxx~iphone.xib  和 xxx~ipad.xib 2.初始化时使用 [[xxx alloc] init] 即可,系统会自动判断系统类型并加载对应的 xib ...

  7. IP冲突解决方案

    客人在我所供职的酒店上网的时候,经常会弹出一个对话框,显示一些提示,如上网的注意事项和消费标准等信息;并且有自己的电影和歌曲服务器,DHCP-server也是其中的一台服务器,宾馆.酒店就是用这台机器 ...

  8. js准确获取当前页面url网址信息

    这篇文章主要为大家介绍了js准确获取当前页面url网址信息的多种方法,包括正则法.split拆分法等,需要的朋友可以参考下   在WEB开发中,时常会用到javascript来获取当前页面的url网址 ...

  9. 文件传输协议(FTP,SFTP,SCP)(修改中)

    FTP(File Transfer Protocol):是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层.FTP ...

  10. 织梦漏洞可疑PHP文件/article文件夹

    常见可疑文件夹: 1:article文件夹:最近很多织梦系统网站根目录被上传article文件件,里面有很多赌博静态违法html页面,可疑直接删除,此类违法信息大部分是由于您的网站存在dedecms安 ...