iOS 设计模式系列:Memento – 备忘录模式
备忘录模式是捕获和具体化当前对象的内部状态。换句话说,就是在某个地方存储个东西。稍后,在不违反封装的情况下能够恢复这个具体化的状态;就是说,一些私有数据被私下存储下来了。
如何使用备忘录模式
添加下面两个方法到 ViewController.m 文件:
- (void)saveCurrentState
{// 当用户退出应用之后再重新打开,他想要跟他之前退出时一样的状态// 退出应用,这个时候我们需要做的是把当前显示的专辑存储下来// 因为只有一小片信息,我们可用 NSUserDefaults 来存储信息[[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@“currentAlbumIndex”];
}- (void)loadPreviousState
{currentAlbumIndex = [[NSUserDefaults standardUserDefaults] integerForKey@“currentAlbumIndex”];[self showDataForAlbumAtIndex:currentAlbumIndex];
}
saveCurrentState 存储当前专辑的索引到 NSUserDefaults ─ NSUserDefaults 是一个标准数据存储,iOS 用来专门存放程序设置和数据。
loadPreviousState 加载这之前存储的专辑索引。这不是备忘录模式的全部,不过你已经达到目的了。
现在,在 ViewController.m 里,滚动视图初始化之前,在 viewDidLoad 里添加下面一行:
[self loadPreviousState];
当程序启动的时候加载上一次存储的状态。但是你在哪里存储程序的当前状态呢?你需要使用通知来做这样的事情。当程序进入后台时,iOS 会发送一个 UIApplicationDidEnterBackgroundNotification 通知。你可利用这个通知调用 saveCurrentState。就这么方便?
在 viewDidLoad: 最后面添加下面一行
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveCurrentState) name:UIApplicationDidEnterBackgroundNotification object:nil];
现在,当你的 app 进入后台运行后,ViewController 会自动调用 saveCurrentState 存储当前的状态。
现在,添加下面代码:
- (void)dealloc
{[[NSNotificationCenter defaultCenter] removeObserver:self];
}
这里是确保当 ViewController 被释放时,移除类的 Observer。
构建和运行你的 app,点击到一个专辑,用 Command+Shift+H(如果你使用的是模拟器的话) 将程序在后台运行,然后关掉 app。重启 app,检查之前选择的专辑是不是居中显示:
专辑数据看起来是对的,但是正确的专辑封面确没有居中,哪出问题了?
这就是可选方法 initialViewIndexForHorizontalScroller 的用处!因为这个方法没有被委托执行,ViewController 在这种情况下总是会显示默认的第一个专辑封面。
修复这个问题,在 ViewController.m 中添加如下代码:
- (NSInteger)initialViewIndexForHorizontalScroller:(HorizontalScroller *)scroller
{return currentAlbumIndex;
}
现在 HorizontalScroller 的第一个视图总是会被设置成 currentAlbumIndex 索引的图片。这种方法能够确保你的 app 有一个非常棒的用户体验,并且它是可恢复的。
重新运行你的 app,滚动专辑封面,关闭 app,然后重启确保问题已经得到解决:
如果你查看 PersistencyManger 的初始化方法,你会注意到专辑的数据是一种硬编码,PersistencyManger 每次创建,数据也会重复创建一次。有没有一种更好的方法当专辑列表被创建的时候就存储它们呢。那么如何把专辑数据存储到文件里呢?
一种选择就是循环访问 Album 的属性,然后把它存储在一个 plist 文件里,当需要它们的时候重新创建一个 Album 的实例。这不是最好的选择,这需要你在每一个类里根据不同的数据或属性写特定的代码。例子,如果稍后你需要一个电影的类,里面有一些不同的属性,存储和加载这些数据你就需要写一些新的代码。
此外,你不能在每一个类的实例里存储私有变量,因为他们是不可访问的外部类。这就是为什么苹果要创建归档 (Archiving) 机制。
iOS 设计模式系列:Memento – 备忘录模式相关推荐
- IOS设计模式之四(备忘录模式,命令模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- 设计模式学习笔记--Memento 备忘录模式
在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现. 如何实现 ...
- 设计模式——Memento(备忘录)模式
目录 前言 1 定义 2 适用情况 3 结构 3.1 结构图 3.2 参与者 4 应用举例 4.1 Memento和MementoCare 4.2 Orginator--UrlEntity 4.3 C ...
- 设计模式系列·抽象工厂模式
前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...
- Java设计模式系列--责任链模式(应用)
原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...
- 设计模式系列之建造者模式构建实体类
设计模式系列之建造者模式(Build Pattern)构建实体类 模式定义 建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法. 所谓建造者模式就是**将组件和组件的组件过 ...
- Net设计模式实例之备忘录模式(Memento Pattern)
一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...
- [设计模式-行为型]备忘录模式(Memento)
一句话 让某个对象可以取到之前的某个状态值. 概括 解析 MEMENTO-同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么 ...
- 设计模式系列 — 中介者模式
点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...
最新文章
- git remote扩展
- Java多线程核心知识
- 【CV冬季划】终极进阶,超30个项目实战+3本书+3年知识星球
- 深度学习85—[深度学习] 感知器
- awk bc命令 linux_linux之awk命令(转载)
- nagios流量监控报警
- 情人节表白(持续更新,欢迎收藏)
- 【原创】Proton在Android上的编译
- Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数...
- # 研究杂感 × VOSviewer(第四辑)
- elementui中表格的表头设置背景颜色
- Adobe PS常用快捷键
- Luatos学习:Air101点灯
- day01在线教育行业介绍(01)
- 七牛云 vue 图片上传简单解说,js 上传文件图片
- 华为软件迁移实践微认证题库
- 儿童用台灯用白光好还是暖光好?推荐儿童使用的暖光台灯
- SpringCloud项目中无法识别bootstrap.yml的问题
- C---头指针尾指针
- x265-1.8版本-encoder/slicetype.cpp注释