备忘录模式是捕获和具体化当前对象的内部状态。换句话说,就是在某个地方存储个东西。稍后,在不违反封装的情况下能够恢复这个具体化的状态;就是说,一些私有数据被私下存储下来了。

如何使用备忘录模式

添加下面两个方法到 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 – 备忘录模式相关推荐

  1. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  2. 设计模式学习笔记--Memento 备忘录模式

    在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现.      如何实现 ...

  3. 设计模式——Memento(备忘录)模式

    目录 前言 1 定义 2 适用情况 3 结构 3.1 结构图 3.2 参与者 4 应用举例 4.1 Memento和MementoCare 4.2 Orginator--UrlEntity 4.3 C ...

  4. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  5. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

  6. 设计模式系列之建造者模式构建实体类

    设计模式系列之建造者模式(Build Pattern)构建实体类 模式定义 建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法. 所谓建造者模式就是**将组件和组件的组件过 ...

  7. Net设计模式实例之备忘录模式(Memento Pattern)

    一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...

  8. [设计模式-行为型]备忘录模式(Memento)

    一句话 让某个对象可以取到之前的某个状态值. 概括 解析 MEMENTO-同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么 ...

  9. 设计模式系列 — 中介者模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...

最新文章

  1. git remote扩展
  2. Java多线程核心知识
  3. 【CV冬季划】终极进阶,超30个项目实战+3本书+3年知识星球
  4. 深度学习85—[深度学习] 感知器
  5. awk bc命令 linux_linux之awk命令(转载)
  6. nagios流量监控报警
  7. 情人节表白(持续更新,欢迎收藏)
  8. 【原创】Proton在Android上的编译
  9. Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数...
  10. # 研究杂感 × VOSviewer(第四辑)
  11. elementui中表格的表头设置背景颜色
  12. Adobe PS常用快捷键
  13. Luatos学习:Air101点灯
  14. day01在线教育行业介绍(01)
  15. 七牛云 vue 图片上传简单解说,js 上传文件图片
  16. 华为软件迁移实践微认证题库
  17. 儿童用台灯用白光好还是暖光好?推荐儿童使用的暖光台灯
  18. SpringCloud项目中无法识别bootstrap.yml的问题
  19. C---头指针尾指针
  20. x265-1.8版本-encoder/slicetype.cpp注释

热门文章

  1. 上班族和学生用的台灯护眼的哪种比较好,盘点五款比较好的台灯
  2. iOS 打电话、发短信、发邮箱 、跳转网站 功能(系统方法)
  3. HTML空格占位符 空行,整理,待以后查看
  4. oracle 优化之parallel和append
  5. 试题 算法训练 观星 java 题解 624
  6. RPA与AI、低代码、BPM既同场竞技,又融合共生
  7. JS中函数传参按照值传递
  8. 使用颜色(color)资源
  9. 这个不到1MB的应用,苹果CEO库克看了都想哭
  10. Nginx的HTTP Code444和307设置