您好,登錄后才能下訂單哦!
學習 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。