学习 About iOS App Programming 第三天
-------State Preservation and Restoration
即使我们的app能支持后台运行,但它也不能一直在后台运行,有一些情况,系统也许会需要终止app,为了释放内存给在前台运行的app。但是用户不关心app是不是被关闭,用户只知道这个app应用就是这个地方暂停了,当再次起来时应该就在上一次退出的地方。这样用户能继续进行他上次没有完成的任务。因此UIKit实现了这种功能。
UIKit的状态保存系统提供了一个简单同时比较精准的基础技术对于保存和恢复app viewcontroller状态。这个基础技术的作用是控制保存和恢复进程在适当的时候进行。为了做那,UIKit需要开发者对这个app,开发只要知道app的内容就行了,其他系统就帮开发做完了。
当前页面的保存和恢复必须要app对这两种机制进行支持,因此app必须在本质上支持UIKit,同时能让UIKit操作app状态的保存和恢复在适当的时候。因为UIKit要能实现这样的操作,需要操作比较多的方法。
在两种情况下,就要用到app状态保存和恢复。app状态的保存一般发生在app退到后台的时候。在那个时候,UIKit需要知道你的这个app的view和viewControl需要不需要保存。对于每次保存,UIkit都把需要保存的相关数据保存在磁盘上。但app再次启动时,app将磁盘中找到上次保存的数据,并这些数据恢复。在重新创建当前对象时,需要操作viewControllerz中的代码,因为app可能需要去加载对象从storyboard动态的加载文件。因为这个加载过程只有我们自己的代码知道。
在app状态的保存和恢复过程中,app有少量的事情要做。
在app状态保存时,app需要做这样一些事:
告诉UIKIt该app支持状态保存。
告诉那些view和viewController需要保存。
对相应的数据进行编码。
在数据恢复时,app需要做的事:
告诉UIKit需要支持数据恢复。
提供(创建)UIKit恢复数据需要对象。
解码需要恢复对象和用它达到保存之前的状态。
app的任务,最主要的是告诉UIKit那些对象需要保存和需要提供那些对象在重新起来的队列中。开发者需要花一些时间当设计app的状态的保存和恢复代码时。他们也有许多控制在当前过程中。
UIKit仅仅保存那些有恢复id的对象,一个恢复ID是一个唯一字符串,用来标识view和viewControl。这个字符串的值是很重要仅仅对告诉UIkit那个对象需要保存,在保存过程中,UIkit将app需要的viewControler层次和保存所有有恢复ID的对象。如果一个viewController没有恢复ID,则这个viewControler所有子类viewController都不能保存。
基于我们的app,它也许不是很清楚知道保存每一个viewController,如果viewController呈现一个断续的消息,我们也许不希望达到这样一个效果,反而更加希望选择交互稳定。
对每个viewcontroller开发者可以选着去保存,同时开发者也需要决定怎样去恢复它,UIKit提供了两种方式去重建这个对象,开发者可以让我们appdelegate重新创建一个或者可以赋值一个恢复对象给viewcontroller和让这类重建。
UIViewControllerRestoration协议和对找到或者创建一个指定对象在恢复时,下面是一个小的建议:
1 如果一个viewcontroller经常被加载从app的main storyboard文件在起来时,不要赋值一个恢复类。让app代理找到对象或者用UIKit支持间接找到这个对象。
2 对一个viewcontroller不会从mainstoryboard 文件中加载在起来时,赋值为一个恢复类。最简单的选着是使没有viewcontroller有他们自己的恢复类对应。
在保存过程,UIKit标志化对象将保存和记录下每一个与之相关对象状态到磁盘中。每一个viewcontroller对象都又一次机会写出记录出那些需要保存数据。比如,当一个tableview需要保存当时选着的tablecell,UIKit也保存一些信息比如viewcontroller的恢复类,和如果有恢复id,UIKit要求保存他们状态信息。
当app再次起来时,UIKit加载app的main storyBoard或者nib文件通常,调用app的代理方式application:willFinishLaunchingWithOptions:方法,然而会去恢复以前保存的状态。第一件做的事是请求app提供一些viewcontroller对象那些之前保存的对象。如取到了viewcontroller类,则就恢复页面。
要想实现状态保存和恢复需要完成以下工作:
1 必须实现application:shouldSaveApplicationState:
and application:shouldRestore
ApplicationState:这两个代理方法,
2 需要对每一个viewcontroller赋值一个非空得字符串作为恢复id。
3 如想保存一个特定view的状态,赋值一个飞空字符串给他们restorationIdentifier的属性
4 分配一个恢复类给一个合适的viewcontroller,(当app代理请求viewcontroller在恢复时)。
5 viewcontroller的 序列化和反序列化使用encodeRestorableStateWithCoder:
和
decodeRestorableStateWithCoder:方法。
6 序列化和反序列化一些版本信息或者一些状态信息针对于app,建议用application:willEncode-
RestorableStateWithCoder:
和application:didDecodeRestorableStateWithCoder:代理方法。
7tableview和collectionview的数据源对象应该实现UIDataSourceModelAssociation
协议,虽然这个不是必要的,但是这个协议能帮助保存对应的view中得的选项。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。