李玉君
摘要:在IOS開發(fā)中,數(shù)據(jù)存儲(chǔ)也是一個(gè)非常重要的研究。該文通過(guò)對(duì)現(xiàn)在主流的4種主流數(shù)據(jù)存儲(chǔ)技術(shù)分析,詳細(xì)研究了對(duì)象歸檔中技術(shù)對(duì)數(shù)據(jù)的持久化操作,并使用蘋果新推出的Swift語(yǔ)言采用對(duì)對(duì)象的歸檔和反歸檔實(shí)現(xiàn)了對(duì)示例數(shù)據(jù)的存儲(chǔ)。
關(guān)鍵詞:IOS; Swift; NSCoding; 數(shù)據(jù)持久化
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)09-0005-03
Abstract: In the IOS development, Persist Datais also a very important research. Through the analysis of four mainstream Persist Data technologies, The persistence operation of data through NSCoding in object archive is analyzed in detail.the storage of sample data is realized by the archiving and anti archiving of the object.
Key words: IOS; Swift; NSCoding; DataPersist
在移動(dòng)軟件開發(fā)世界,幾乎離不開對(duì)數(shù)據(jù)的存儲(chǔ)。而數(shù)據(jù)存儲(chǔ)分為運(yùn)行時(shí)存儲(chǔ)和持久化存儲(chǔ)兩種,運(yùn)行時(shí)存儲(chǔ)在程序運(yùn)行時(shí)會(huì)把數(shù)據(jù)存放在內(nèi)存中,程序結(jié)束后,內(nèi)容會(huì)回收,數(shù)據(jù)將不保存。因此為了程序運(yùn)行更加流暢,用戶體驗(yàn)更好,在實(shí)際開發(fā)中需要采用特定類型的文件將數(shù)據(jù)保存到本地?,F(xiàn)在主要有4種數(shù)據(jù)持久化的方法,這4種方法分別為:屬性歸檔、對(duì)象歸檔、IOS的嵌入式關(guān)系數(shù)據(jù)庫(kù)SQLite3、蘋果公司提供的持久化工具Core Data。在現(xiàn)實(shí)開發(fā)中,我們不需要處理大批量數(shù)據(jù)時(shí),將不會(huì)采用SQLite和Core Data,這時(shí)只需要將對(duì)象實(shí)體做持久化保存就可,而對(duì)象類型可以通過(guò)NSCoding的委托方法來(lái)實(shí)現(xiàn)。本文是校級(jí)項(xiàng)目研究成果。編號(hào)為TP170205,題目是基于IOS環(huán)境下MVC模式成都學(xué)校資源APP設(shè)計(jì)與實(shí)現(xiàn)。
1 沙盒機(jī)制
IOS為每個(gè)應(yīng)用程序都創(chuàng)建了一個(gè)文件系統(tǒng)結(jié)構(gòu)去存儲(chǔ)該應(yīng)用程序的文件,此區(qū)域稱為沙盒。沙盒作為一個(gè)文件系統(tǒng)結(jié)構(gòu),他可以存儲(chǔ)聲音、圖像、文件等文件,并且每個(gè)應(yīng)用程序只能訪問(wèn)自己沙盒內(nèi)的數(shù)據(jù),其他應(yīng)用是無(wú)法訪問(wèn)的。在蘋果系統(tǒng)中想要查看沙盒數(shù)據(jù)需要查看Library目錄。在OS X10.7以后的版本,蘋果公司默認(rèn)隱藏了Library文件夾,因此打開Finder窗口后,需要按住Option鍵,并選擇前往->資源庫(kù),向下找到Developer/CoreSimulator/devices/模擬器UDID/Data/Containers/Data/Application,可以看到模擬器中所有程序沙盒目錄,每個(gè)應(yīng)用都有自己的/Documents文件夾,且僅能讀寫各自/Documents目錄中內(nèi)容[1]。每個(gè)應(yīng)用程序沙盒都應(yīng)包含以下三個(gè)目錄:
(1)Documents:應(yīng)用程序可以將數(shù)據(jù)存儲(chǔ)在Documents目錄中,應(yīng)用程序啟用iTunes文件分享功能,則用戶可以在iTunes中看到目錄的內(nèi)容,以及應(yīng)用程序創(chuàng)建的所有子目錄,還可以對(duì)其更新文件。
(2)Library:應(yīng)用程序也可以在這里數(shù)據(jù)存儲(chǔ),存放不想分享給用戶的文件,需要時(shí)可創(chuàng)建自己的子目錄。
(3)tmp:供應(yīng)存儲(chǔ)臨時(shí)文件,當(dāng)iOS設(shè)備執(zhí)行同步時(shí),iTunes不會(huì)備份tmp中的文件,在不需要這些文件時(shí),應(yīng)用負(fù)責(zé)刪除tmp中的文件,以免占用文件系統(tǒng)的空間。
隨機(jī)打開一個(gè)應(yīng)用沙盒,如圖3所示。
從圖1可以看出應(yīng)用的名稱看上去是隨機(jī)的文件夾中,這時(shí)可以使用NSSearchPathForDirectoriesInDomain()來(lái)查找各種目錄。該函數(shù)可以基于OS X平臺(tái)的Cocoa共享,獲取Document目錄的部分代碼:
Let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)
letdocunmentsDirectory = path[0] as String
通過(guò)NSSearchPathDirectory.DocumentDirectory查找Document目錄的路徑,NSSearchPathDomainMask.UserDomainMask表示搜索限制在應(yīng)用沙盒內(nèi)。以上函數(shù)返回的是一個(gè)匹配路徑的數(shù)字,但位于索引0處的一定是Document目錄,因?yàn)槊總€(gè)應(yīng)用只有Document目錄,所以只有一個(gè)目錄符合指定的條件。
2 對(duì)象歸檔概述
對(duì)象歸檔是將一個(gè)或者多個(gè)對(duì)象,采用序列化的方式保存到指定的文件,再以反序列化的方式從文件恢復(fù)成對(duì)象,整個(gè)過(guò)程有些類似于壓縮和解壓縮文件的過(guò)程。在對(duì)象歸檔技術(shù)中,有一個(gè)非常重要的協(xié)議NSCoding。凡是遵守了NSCoding協(xié)議的自定義對(duì)象都可以實(shí)現(xiàn)對(duì)象歸檔和反歸檔。類繼承它,此類的實(shí)例才能被編碼(encode)和解碼(decode),繼承了這個(gè)類,也就實(shí)現(xiàn)兩個(gè)方法。這兩個(gè)方法都是必需的,一個(gè)方法將對(duì)象編碼到歸檔中:encode(with aCoder: NSCoder),另一個(gè)方法對(duì)歸檔解碼用來(lái)創(chuàng)建一個(gè)新對(duì)象,init?(coder aDecoder: NSCoder)這兩個(gè)方法都床底一個(gè)NSCoder實(shí)例,可以使用鍵值編碼(Key-Value Coding)對(duì)對(duì)象和原生數(shù)據(jù)類型(如整形)進(jìn)行編碼和解碼。
3 Swift實(shí)現(xiàn)采用對(duì)象歸檔實(shí)例分析
如圖2學(xué)校展示界面所示,我們想存儲(chǔ)當(dāng)前頁(yè)面上的展示的學(xué)校名字,地址,電話,網(wǎng)站,性質(zhì)和區(qū)域數(shù)據(jù),需要建立與數(shù)據(jù)對(duì)應(yīng)的對(duì)象,然后通過(guò)NSCoding對(duì)數(shù)據(jù)進(jìn)行讀寫。
1)先建立一個(gè)swift的school類文件專門用來(lái)做數(shù)據(jù)存放處理。如圖3所示。
2)創(chuàng)建一個(gè)用于存儲(chǔ)密鑰字符串的結(jié)構(gòu)。包括學(xué)校名,地址,電話,網(wǎng)址,學(xué)校性質(zhì),區(qū)域和照片。
//定義類型
structPropertyKey {
static let name = “name”
static let address = “address”
static let tel = “tel”
static let website = “website”
static let property = “property”
static let area = “area”
static let photo = “photo”
}
3)讓Swift對(duì)象支持歸檔,需要讓它成為NSObject(或任何繼承與NSObject的其他類)的子類,需要建立一個(gè)簡(jiǎn)單容器類。
classSchool :NSObject,NSCoding {
//學(xué)校屬性
var name : String
var address : String
vartel : String
var website : String
var property :String
var area : String
var photo : UIImage?
}
4)繼承于NSCoding需要實(shí)現(xiàn)2個(gè)方法:encode(with aCoder: NSCoder),init?(coderaDecoder: NSCoder)
//從coder中讀取數(shù)據(jù),保存到相應(yīng)的變量中,即反序列化數(shù)據(jù)
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: PropertyKey.name)
aCoder.encode(address, forKey: PropertyKey.address)
aCoder.encode(tel, forKey: PropertyKey.tel)
aCoder.encode(website, forKey: PropertyKey.website)
aCoder.encode(property, forKey: PropertyKey.property)
aCoder.encode(area, forKey: PropertyKey.area)
aCoder.encode(photo, forKey: PropertyKey.photo)
}
//讀取實(shí)例變量,并把這些數(shù)據(jù)寫到coder中去。
Required convenience init?(coder aDecoder: NSCoder) {
guard let name = aDecoder.decodeObject(forKey:PropertyKey.name) as? String else {
os_log(“Unable to decode the name for a JinuNiu object.”, log: OSLog.default, type: .debug)
return nil
}
let address = aDecoder.decodeObject(forKey:PropertyKey.address) as? String
lettel = aDecoder.decodeObject(forKey:PropertyKey.tel) as? String
let website = aDecoder.decodeObject(forKey:PropertyKey.website) as? String
let property = aDecoder.decodeObject(forKey:PropertyKey.property) as? String
let area = aDecoder.decodeObject(forKey:PropertyKey.area) as? String
let photo = aDecoder.decodeObject(forKey:PropertyKey.photo) as? UIImage
self.init(name:name,address:address!,tel:tel!,website:website!,property:property!,area:area!,photo:photo)
}
5)創(chuàng)建一個(gè)路徑去存放數(shù)據(jù)
那么應(yīng)用位于一個(gè)名稱看上去隨機(jī)的文件夾中,應(yīng)該如何檢索Documents的完整路徑,才能正確方便的讀取和寫入文件呢?我們可以使用FileManager定位到應(yīng)用文件位置直接讀寫。將以下代碼加入到之前建立的Swift文件。
//存儲(chǔ)位置
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent(“school”)
4 結(jié)束語(yǔ)
在手機(jī)使用率越來(lái)越高的今天,為用戶提供快而準(zhǔn)的服務(wù)是每個(gè)行業(yè)發(fā)展的必然趨勢(shì),數(shù)據(jù)的快速存儲(chǔ)可以明顯提高軟件性能,提高用戶體驗(yàn)度,可想而知它在軟件開發(fā)中的重要性之大。為了更好學(xué)習(xí)數(shù)據(jù)存儲(chǔ)的知識(shí),我們非常有必要對(duì)IOS中數(shù)據(jù)處理有一個(gè)深刻的認(rèn)識(shí),認(rèn)識(shí)其重要性。未來(lái),我們還將更好的使用數(shù)據(jù)存儲(chǔ)技術(shù),讓其更好地為我們未來(lái)的工作生活服務(wù),加快計(jì)算機(jī)信息化的發(fā)展。本文通過(guò)對(duì)對(duì)象歸檔技術(shù)的分析及實(shí)現(xiàn)希望能對(duì)正在做這部分的同行提供學(xué)習(xí)和借鑒。
參考文獻(xiàn):
[1] David Mark.精通IOS開發(fā)[M].人民郵電出版社,2016:301-314.
[2] 傳智播客高教產(chǎn)品研發(fā)部[M].IOS開發(fā)項(xiàng)目化入門教程.人民郵電出版社,2017:236-254.
[3] 李偉夢(mèng). Swift編程入門經(jīng)典[M]. 北京:清華大學(xué)出版社,2015.
[4] The Swift Programming Language (Swift 4.0.3).Language Guide.2017
[5] 李艷華. iOS平臺(tái)上基于MVC的設(shè)計(jì)模式的“音悅臺(tái)”的設(shè)計(jì)與實(shí)現(xiàn)[J].電子技術(shù),2015(9).