版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2019.08.25 星期日 |
前言
數(shù)據(jù)的持久化存儲(chǔ)是移動(dòng)端不可避免的一個(gè)問題酝掩,很多時(shí)候的業(yè)務(wù)邏輯都需要我們進(jìn)行本地化存儲(chǔ)解決和完成悯舟,我們可以采用很多持久化存儲(chǔ)方案口四,比如說
plist
文件(屬性列表)羊异、preference
(偏好設(shè)置)、NSKeyedArchiver
(歸檔)读慎、SQLite 3
、CoreData
槐雾,這里基本上我們都用過夭委。這幾種方案各有優(yōu)缺點(diǎn),其中募强,CoreData是蘋果極力推薦我們使用的一種方式株灸,我已經(jīng)將它分離出去一個(gè)專題進(jìn)行說明講解。這個(gè)專題主要就是針對(duì)另外幾種數(shù)據(jù)持久化存儲(chǔ)方案而設(shè)立擎值。
1. 數(shù)據(jù)持久化方案解析(一) —— 一個(gè)簡(jiǎn)單的基于SQLite持久化方案示例(一)
2. 數(shù)據(jù)持久化方案解析(二) —— 一個(gè)簡(jiǎn)單的基于SQLite持久化方案示例(二)
3. 數(shù)據(jù)持久化方案解析(三) —— 基于NSCoding的持久化存儲(chǔ)(一)
4. 數(shù)據(jù)持久化方案解析(四) —— 基于NSCoding的持久化存儲(chǔ)(二)
5. 數(shù)據(jù)持久化方案解析(五) —— 基于Realm的持久化存儲(chǔ)(一)
6. 數(shù)據(jù)持久化方案解析(六) —— 基于Realm的持久化存儲(chǔ)(二)
7. 數(shù)據(jù)持久化方案解析(七) —— 基于Realm的持久化存儲(chǔ)(三)
Overview
UIDocument
用于管理應(yīng)用數(shù)據(jù)的離散部分的抽象基類慌烧。
首先看下框架基本信息
使用UIDocument
及其底層架構(gòu)的應(yīng)用程序可為其文檔帶來許多好處:
- 異步讀取和寫入后臺(tái)隊(duì)列
(background queue)
上的數(shù)據(jù)。因此幅恋,在進(jìn)行讀寫操作時(shí)杏死,應(yīng)用程序?qū)τ脩舻捻憫?yīng)性不會(huì)受到影響。 - 協(xié)調(diào)讀取和寫入與云服務(wù)自動(dòng)集成的文檔文件捆交。
- 支持發(fā)現(xiàn)文檔的不同版本之間的沖突(如果發(fā)生)淑翼。
- 通過首先將數(shù)據(jù)寫入臨時(shí)文件然后用它替換當(dāng)前文檔文件來安全地保存文檔數(shù)據(jù)。
- 在適當(dāng)?shù)臅r(shí)刻自動(dòng)保存文檔數(shù)據(jù)品追;這種機(jī)制包括支持處理暫停行為玄括。
在Model-View-Controller
設(shè)計(jì)模式中,UIDocument
對(duì)象是模型對(duì)象或模型控制器對(duì)象 - 它管理文檔的數(shù)據(jù)或共同構(gòu)成文檔數(shù)據(jù)的聚合模型對(duì)象肉瓦。您通常將其與視圖控制器配對(duì)遭京,該視圖控制器管理顯示文檔內(nèi)容的視圖。 UIDocument
不支持管理文檔視圖泞莉。
基于文檔的應(yīng)用程序包括可以生成多個(gè)文檔的應(yīng)用程序哪雕,每個(gè)文檔都有自己的文件系統(tǒng)位置■瓿茫基于文檔的應(yīng)用程序必須為其文檔創(chuàng)建UIDocument
的子類斯嚎。有關(guān)詳細(xì)信息,請(qǐng)參閱下面的Subclassing Notes
。
注意:如果使用數(shù)據(jù)庫存儲(chǔ)文檔數(shù)據(jù)堡僻,請(qǐng)創(chuàng)建UIManagedDocument類的子類而不是
UIDocument
糠惫;UIManagedDocument
是UIDocument
的子類。
UIDocument
體系結(jié)構(gòu)中文檔的主要屬性是其文件URL钉疫。 通過調(diào)用initWithFileURL:初始化文檔子類的實(shí)例時(shí)硼讽,必須傳遞在應(yīng)用程序沙箱中查找文檔文件的文件URL
。 UIDocument
從文件URL確定文件類型(與文件擴(kuò)展名關(guān)聯(lián)的統(tǒng)一類型標(biāo)識(shí)符)和文檔名稱(文件名組件)牲阁。 您可以覆蓋fileType和localizedName屬性的訪問器方法以提供不同的值固阁。
以下概述了典型document
的生命周期(有關(guān)實(shí)現(xiàn)細(xì)節(jié),請(qǐng)參閱Subclassing Notes
):
-
1) 您可以創(chuàng)建新文檔或打開現(xiàn)有文檔城菊。
- 要?jiǎng)?chuàng)建新文檔您炉,請(qǐng)分配并初始化子類的實(shí)例,然后在實(shí)例上調(diào)用saveToURL:forSaveOperation:completionHandler:役电。
- 要打開現(xiàn)有文檔(由用戶選擇)赚爵,請(qǐng)分配并初始化子類的實(shí)例,然后在實(shí)例上調(diào)用 openWithCompletionHandler:法瑟。
-
2) 用戶編輯文檔冀膝。
- 在用戶編輯時(shí),跟蹤對(duì)文檔的更改霎挟。
UIDocument
會(huì)定期記錄何時(shí)有未保存的更改并將文檔數(shù)據(jù)寫入其文件窝剖。
- 在用戶編輯時(shí),跟蹤對(duì)文檔的更改霎挟。
-
3) 用戶請(qǐng)求將文檔與云服務(wù)集成(可選)。
- 您必須啟用云存儲(chǔ)文檔酥夭。 您還必須解決同一文檔的不同版本之間的任何沖突赐纱。
-
4) 用戶關(guān)閉文檔。
- 在文檔實(shí)例上調(diào)用closeWithCompletionHandler:熬北,如果有任何未保存的更改疙描,
UIDocument
將保存文檔。
- 在文檔實(shí)例上調(diào)用closeWithCompletionHandler:熬北,如果有任何未保存的更改疙描,
典型的基于文檔的應(yīng)用程序在主線程上調(diào)用openWithCompletionHandler:讶隐,closeWithCompletionHandler:和saveToURL:forSaveOperation:completionHandler:起胰。當(dāng)這些方法啟動(dòng)的讀取或保存操作結(jié)束時(shí),完成處理程序塊在調(diào)用該方法的同一調(diào)度隊(duì)列上執(zhí)行巫延,允許您根據(jù)讀取或保存操作完成任何任務(wù)效五。如果操作不成功,則將NO
傳遞到完成 - 處理(completion-hander)
程序塊炉峰。
Implementation of the NSFilePresenter Protocol
UIDocument
類采用NSFilePresenter協(xié)議畏妖。當(dāng)另一個(gè)客戶端嘗試讀取基于UIDocument
的應(yīng)用程序的文檔時(shí),該讀取將暫停疼阔,直到UIDocument
對(duì)象有機(jī)會(huì)保存對(duì)該文檔所做的任何更改戒劫。
雖然有些實(shí)現(xiàn)什么都不做适瓦,但UIDocument
實(shí)現(xiàn)了所有NSFilePresenter
方法。具體來說谱仪,UIDocument
:
- 實(shí)現(xiàn)relinquishPresentedItemToReader:轉(zhuǎn)發(fā)傳入的塊以執(zhí)行performAsynchronousFileAccessUsingBlock:。
- 實(shí)現(xiàn)relinquishPresentedItemToWriter:檢查文件修改日期是否已更改否彩;如果文件比以前更新疯攒,則調(diào)用revertToContentsOfURL:completionHandler:將fileURL的值作為
URL
參數(shù)。 - 實(shí)現(xiàn)presentedItemDidMoveToURL:更新文檔的文件
URL(fileURL)
列荔。
在您的UIDocument
子類中敬尺,如果重寫NSFilePresenter
方法,則始終可以調(diào)用超類實(shí)現(xiàn)(super)
贴浙。
Subclassing Notes
每個(gè)基于文檔的應(yīng)用程序必須創(chuàng)建UIDocument
的子類砂吞,其實(shí)例表示其文檔。大多數(shù)應(yīng)用程序的子類化要求很簡(jiǎn)單:
- 對(duì)于編寫操作崎溃,請(qǐng)實(shí)現(xiàn)contentsForType:error:方法以提供文檔數(shù)據(jù)的快照蜻直。數(shù)據(jù)必須采用
NSData
對(duì)象(對(duì)于平面文件)或NSFileWrapper
對(duì)象(對(duì)于文件包)的形式。寫操作通常通過自動(dòng)保存功能啟動(dòng)袁串。 - 對(duì)于讀取操作概而,實(shí)現(xiàn)loadFromContents:ofType:error:方法以接收
NSData
或NSFileWrapper
對(duì)象并使用它初始化應(yīng)用程序的數(shù)據(jù)結(jié)構(gòu)。 - 實(shí)施更改跟蹤以啟用自動(dòng)保存功能囱修。有關(guān)詳情赎瑰,請(qǐng)參閱 Change Tracking
- 為文檔啟用云服務(wù)時(shí),解決文檔的不同版本之間的沖突破镰。有關(guān)詳細(xì)信息餐曼,請(qǐng)參閱 Conflict Resolution and Error Handling。
contentsForType:error:
和loadFromContents:ofType:error:
通常在主隊(duì)列上調(diào)用方法鲜漩。進(jìn)一步來說:
- 在調(diào)用saveToURL:forSaveOperation:completionHandler:方法的隊(duì)列上調(diào)用
contentsForType:error:
方法源譬;數(shù)據(jù)寫入發(fā)生在后臺(tái)線程上。 - 在調(diào)用openWithCompletionHandler:方法的隊(duì)列上調(diào)用
loadFromContents:ofType:error:
方法孕似。
如果您對(duì)讀取和寫入contentsForType:error:
和loadFromContents:ofType:error:
方法的文檔數(shù)據(jù)有特殊要求瓶佳,則可以重寫UIDocument
類的其他方法。有關(guān)這些要求和方法的討論鳞青,請(qǐng)參閱Advanced Overrides霸饲。
1. Change Tracking
要啟用UIDocument
的自動(dòng)保存功能,您必須在用戶更改文檔時(shí)通知它臂拓。 UIDocument
定期檢查hasUnsavedChanges方法是否返回YES
; 如果是厚脉,則啟動(dòng)文檔的保存操作。
在UIDocument
子類中實(shí)現(xiàn)更改跟蹤有兩種主要方法:
- 調(diào)用NSUndoManager類的方法來實(shí)現(xiàn)文檔的撤消和重做胶惰。 您可以從
undoManager
屬性訪問默認(rèn)的NSUndoManager
對(duì)象傻工。 這是首選方法,尤其適用于已支持撤消和重做的現(xiàn)有應(yīng)用程序。 - 在代碼中的相應(yīng)接口處調(diào)用updateChangeCount:方法中捆。
2. Conflict Resolution and Error Handling
UIDocument
對(duì)象在其生命周期中的任何時(shí)刻都具有特定狀態(tài)鸯匹。您可以通過查詢documentState
屬性來檢查當(dāng)前狀態(tài),并通過觀察UIDocumentStateChangedNotification
通知獲得有關(guān)更改的通知泄伪。
如果為iCloud
啟用了文檔殴蓬,則檢查是否存在沖突版本并嘗試解決沖突非常重要。通過偵聽UIDocumentStateChangedNotification
通知然后檢查文檔狀態(tài)是否為UIDocumentStateInConflict
來執(zhí)行此操作蟋滴。此狀態(tài)表示文檔存在沖突版本染厅,您可以通過調(diào)用NSFileVersion
類方法unresolvedConflictVersionsOfItemAtURL:
來訪問該文檔,并傳入文檔的文件URL津函。如果您無需用戶交互即可正確解決沖突肖粮,請(qǐng)執(zhí)行此操作。否則尔苦,離散地通知用戶存在沖突并讓他們選擇如何解決沖突涩馆。可能的方法包括:
- 顯示沖突的版本允坚,用戶可以從中選擇一個(gè)或兩個(gè)版本來保留
- 顯示合并版本并為用戶提供選擇它的選項(xiàng)
- 顯示文件修改日期并為用戶提供選擇其中一個(gè)或兩個(gè)的選項(xiàng)
除了指示文件間沖突之外凌净,文檔狀態(tài)可以指示錯(cuò)誤。例如屋讶,UIDocumentStateClosed
表示讀取時(shí)出錯(cuò)冰寻,UIDocumentStateSavingError
表示保存或還原文檔時(shí)出錯(cuò)。通過傳遞給openWithCompletionHandler:
皿渗,closeWithCompletionHandler:
斩芭,revertToContentsOfURL:completionHandler:
和saveToURL:forSaveOperation:completionHandler:
方法的完成處理程序的success
參數(shù),通知您的應(yīng)用程序讀取和寫入錯(cuò)誤乐疆。
您可以通過調(diào)用或?qū)崿F(xiàn) handleError:userInteractionPermitted:方法來處理錯(cuò)誤划乖;此方法由openWithCompletionHandler
的默認(rèn)實(shí)現(xiàn)調(diào)用和saveToURL:forSaveOperation:completionHandler:
分別在UIDocument
對(duì)象遇到讀取或?qū)懭脲e(cuò)誤時(shí)的方法。您可以通過通知用戶來處理讀取挤土,保存和還原錯(cuò)誤琴庵,如果情況允許,則嘗試從錯(cuò)誤中恢復(fù)仰美。
請(qǐng)務(wù)必閱讀contentsForType:error:
方法的說明迷殿,以獲取有關(guān)處理文檔保存期間遇到的錯(cuò)誤的指導(dǎo)。
3. Advanced Overrides
如果應(yīng)用程序?qū)ψx取或?qū)懭胛臋n數(shù)據(jù)有特殊要求咖杂,它可以覆蓋除loadFromContents:ofType:error:
和contentsForType:error:
之外的UIDocument
方法庆寺。這些要求通常包括以下內(nèi)容:
- 增量讀取和寫入大數(shù)據(jù)文件
- 重寫
readFromURL:error:
和writeContents:toURL:forSaveOperation:originalContentsURL:error
方法。
- 重寫
- 文檔數(shù)據(jù)的自定義表示(即诉字,不是
NSData
或NSFileWrapper
對(duì)象)- 覆蓋
readFromURL:error:
方法(讀取文檔數(shù)據(jù)時(shí))和writeContents:toURL:forSaveOperation:originalContentsURL:error:
方法(寫入文檔數(shù)據(jù)時(shí))懦尝。
- 覆蓋
- 在讀取或?qū)懭霐?shù)據(jù)之前或之后執(zhí)行操作
- 覆蓋
openWithCompletionHandler:
和saveToURL:forSaveOperation:completionHandler:
知纷。
- 覆蓋
- 一種安全保存的自定義方法
- 覆蓋
writeContents:andAttributes:safelyToURL:forSaveOperation:error:
方法。
- 覆蓋
- 在保存之前更改文檔的文件類型
- 重寫
saveFileType
方法以返回默認(rèn)(fileType)
以外的文件類型陵霉。一個(gè)例子是RTF
文檔琅轧,在用戶向其添加圖像之后,應(yīng)該將其保存為RTFD
文檔踊挠。
- 重寫
如果覆蓋大多數(shù)這些方法乍桂,請(qǐng)注意所有文檔數(shù)據(jù)的讀取和寫入必須在后臺(tái)隊(duì)列上完成,并且必須與其他嘗試讀取和寫入同一文檔文件相協(xié)調(diào)止毕。因此,您通常應(yīng)該將超類實(shí)現(xiàn)(super)
作為覆蓋的一部分來調(diào)用漠趁,如果調(diào)用其他UIDocument
方法扁凛,則通常應(yīng)該在傳入performAsynchronousFileAccessUsingBlock:
方法調(diào)用的塊中調(diào)用它們。閱讀方法描述以獲取詳細(xì)信息闯传。
4. Thread Safety Considerations
如果通過覆蓋相關(guān)的訪問器方法來覆蓋任何文檔屬性屬性(在 Accessing Document Attributes下列出)谨朝,請(qǐng)注意UIKit
框架可以在后臺(tái)線程上調(diào)用這些訪問器方法。 因此甥绿,您的重寫實(shí)現(xiàn)必須是線程安全的字币。
Topics
1. Initializing a Document Object
返回使用其文件系統(tǒng)位置初始化的文檔對(duì)象。
2. Accessing Document Attributes
-
- 用于初始化文檔的文件URL共缕。
-
- 文檔的本地化名稱洗出。
-
- 文檔的文件類型。
-
- 上次修改文檔文件的日期和時(shí)間图谷。
-
- 返回文檔的當(dāng)前狀態(tài)翩活。
-
- 文檔的上載或下載進(jìn)度。
3. Writing Document Data
-
- 保存任何更改后異步關(guān)閉文檔便贵。
-
- 重寫此方法以返回要保存的文檔數(shù)據(jù)菠镇。
-
saveToURL:forSaveOperation:completionHandler:
- 將文檔數(shù)據(jù)保存到應(yīng)用程序沙箱中的指定位置。
-
writeContents:andAttributes:safelyToURL:forSaveOperation:error:
- 確保將文檔數(shù)據(jù)安全地寫入應(yīng)用程序沙箱中的指定位置承璃。
-
writeContents:toURL:forSaveOperation:originalContentsURL:error:
- 將文檔數(shù)據(jù)寫入由文件URL指示的沙箱位置的磁盤利耍。
-
- 返回用于保存文檔的文件類型。
-
fileAttributesToWriteToURL:forSaveOperation:error:
- 在寫入或更新文檔屬性時(shí)盔粹,返回與文檔文件關(guān)聯(lián)的文件屬性的字典隘梨。
-
fileNameExtensionForType:saveOperation:
- 返回一個(gè)文件擴(kuò)展名,以附加到正在寫入的文檔文件的文件URL舷嗡。
4. Reading Document Data
-
- 異步打開文檔出嘹。
-
loadFromContents:ofType:error:
- 重寫此方法以將文檔數(shù)據(jù)加載到應(yīng)用程序的數(shù)據(jù)模型中。
-
- 在應(yīng)用程序沙箱中指定位置的文件中讀取文檔數(shù)據(jù)咬崔。
5. Accessing Document Files Asynchronously
-
performAsynchronousFileAccessUsingBlock:
- 在并發(fā)后臺(tái)隊(duì)列上安排文檔讀取或文檔寫入操作税稼。
6. Reverting a Document
-
revertToContentsOfURL:completionHandler:
- 將文檔還原為存儲(chǔ)在磁盤上的最新文檔數(shù)據(jù)烦秩。
7. Disabling and Enabling Editing
-
- 重寫以在對(duì)文檔進(jìn)行更改不安全時(shí)禁用編輯。
-
- 重寫以在再次安全時(shí)進(jìn)行編輯以對(duì)文檔進(jìn)行更改郎仆。
8. Tracking Changes and Autosaving
-
- 返回文檔是否有任何未保存的更改只祠。
-
- 通過指示更改類型來更新更改計(jì)數(shù)器。
-
- 文檔的撤消管理器扰肌。
-
changeCountTokenForSaveOperation:
- 重寫以返回特定保存操作的更改標(biāo)記抛寝。
-
updateChangeCountWithToken:forSaveOperation:
- 重寫以參考UIKit傳入的更改計(jì)數(shù)標(biāo)記來更新更改計(jì)數(shù)。
-
autosaveWithCompletionHandler:
- 由UIKit調(diào)用以啟動(dòng)未保存更改的文檔的自動(dòng)保存曙旭。
9. Supporting User Activities
-
- 封裝此文檔支持的用戶活動(dòng)的對(duì)象盗舰。
-
- 恢復(fù)繼續(xù)給定用戶活動(dòng)所需的狀態(tài)。
-
- 更新給定用戶活動(dòng)的狀態(tài)桂躏。
10. Resolving Conflicts and Handling Errors
-
handleError:userInteractionPermitted:
- 調(diào)用或覆蓋以處理嘗試讀取钻趋,保存或還原文檔期間發(fā)生的錯(cuò)誤。
-
finishedHandlingError:recovered:
- 告訴UIKit你已經(jīng)完成了錯(cuò)誤的處理剂习。
-
userInteractionNoLongerPermittedForError:
- 在沒有立即處理錯(cuò)誤的情況下繼續(xù)安全的情況下發(fā)送蛮位。
11. Constants
-
- 用于指定文檔更改類型的常量。
-
- 用于指定保存操作類型的常量鳞绕。
-
- 文件狀態(tài)失仁。
-
- 標(biāo)識(shí)與用戶活動(dòng)關(guān)聯(lián)的文檔的密鑰。
12. Notifications
-
UIDocumentStateChangedNotification
- 當(dāng)文檔狀態(tài)發(fā)生變化時(shí)们何,由文檔對(duì)象發(fā)布萄焦。
13. Conforms To
后記
本篇主要講述了UIDocument的數(shù)據(jù)存儲(chǔ),感興趣的給個(gè)贊或者關(guān)注~~~