Hi,大家好森书,我是姜友華靶端,上一節(jié)我們新建好了工程,并將默認格式設置為人們定義的
.iw
格式凛膏,這一節(jié)我們將實現(xiàn)基于.iw
格式的讀寫躲查。
當前工程是基于單文件格式的讀寫,跟我們的要求不符译柏。前面說過,.iw
格式的設計是多文件的打包姐霍,類似于.epub
格式鄙麦。對于這種格式的處理,macOS提供的FileWrapper
也可以實現(xiàn)镊折,下面讓我們來一步步的實現(xiàn)胯府。
一、 修改配置恨胚。
將Imported Type Identifiers
里的Conforms To
改為com.apple.package
骂因,須便將Exported Type Identifiers
也設置了。
- 如果不設置
Conforms To
為com.apple.package
的話赃泡,那保存下來的文件會以文件夾方式存在寒波。
Conforms To設置為com.apple.package
二、修改讀寫代碼升熊。
1. 讀俄烁。
在這之前writerDocument.swift
文件里,讀只需要從FileWrapper
里獲取數(shù)據(jù)轉為需要的內容即可级野。這里面的configuration.file
是一個FileWrapper
對象∫惩溃現(xiàn)在我們要用它來實現(xiàn).iw
的基于包的讀取。
init(configuration: ReadConfiguration) throws {
guard let wrappers = configuration.file.fileWrappers,
let file = wrappers["main.txt"],
let data = file.regularFileContents,
let string = String(data: data, encoding: .utf8)
else {
throw CocoaError(.fileReadCorruptFile)
}
text = string
}
-
FileWrapper
都有一個fileWrappers屬性,該屬性可以基于map
讀瘸狡蟆(設置肯定要與之對應)风纠。
2. 寫。
在這之前writerDocument.swift
文件里牢贸,寫只用把內容轉為Data添加到FileWrapper
后返回即可≈窆郏現(xiàn)在可以用map進行多層組管理,處理好后返回最頂一級即可十减。
func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
let rootDirectory = FileWrapper(directoryWithFileWrappers: [:])
let data = text.data(using: .utf8)!
let wrapper = FileWrapper(regularFileWithContents: data)
wrapper.filename = "main.txt"
wrapper.preferredFilename = "main.txt"
rootDirectory.addFileWrapper(wrapper)
return rootDirectory
}
3. 運行一下看看栈幸。
-
保存,再去打開帮辟,可以如下情形速址。
保存后,再準備打開 -
在
Finder
里看看由驹。
選擇Untitled.iw
芍锚,右鍵菜單Show Package Contents
,情形如下:
Untitled.iw包里文件
一個獨立的main.txt
文件在那里蔓榄,這是我們在代碼里設置的文件名并炮。
三、iWriter的文件讀寫甥郑。
這是我們前面設計的UI:
iWriter UI
在這里我們需要將每部分的數(shù)據(jù)讀取作進一步的說明逃魄。我們實施的是
各自讀寫
原則。
1. 各自讀寫原則
什么是各自讀寫呢澜搅?
- 區(qū)塊在自身加載時去讀文件伍俘。
- 區(qū)塊在失去焦點時去寫文件。
- 區(qū)塊在自身卸載時清除內容數(shù)據(jù)勉躺。
2. 各區(qū)塊的數(shù)據(jù)加載癌瘾。
- 目錄,加載“catalog.json”文件饵溅。
- 章節(jié)區(qū)妨退,復用“catalog.json”文件數(shù)據(jù),按當前章節(jié)的展開狀態(tài)為是加載章節(jié)文件蜕企。章節(jié)數(shù)據(jù)為
章節(jié)創(chuàng)建時間戳_版本創(chuàng)建時間戳.txt
- 輔助功能區(qū)咬荷,按約定加載對應用的
json
文件。如大綱加載outline.json
文件糖赔。
基于我們的設置萍丐,我們需要在document與UI之間添加一個中間層,用來處理文件讀取放典,這里我們使用了一個Filer
類逝变。
好基茵,就到這里,我是姜友華壳影,一次見拱层。