IOS中对象归档技术的研究与应用

2018-05-28 11:10李玉君
电脑知识与技术 2018年9期

李玉君

摘要:在IOS开发中,数据存储也是一个非常重要的研究。该文通过对现在主流的4种主流数据存储技术分析,详细研究了对象归档中技术对数据的持久化操作,并使用苹果新推出的Swift语言采用对对象的归档和反归档实现了对示例数据的存储。

关键词:IOS; Swift; NSCoding; 数据持久化

中图分类号:TP311 文献标识码:A 文章编号: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

在移动软件开发世界,几乎离不开对数据的存储。而数据存储分为运行时存储和持久化存储两种,运行时存储在程序运行时会把数据存放在内存中,程序结束后,内容会回收,数据将不保存。因此为了程序运行更加流畅,用户体验更好,在实际开发中需要采用特定类型的文件将数据保存到本地。现在主要有4种数据持久化的方法,这4种方法分别为:属性归档、对象归档、IOS的嵌入式关系数据库SQLite3、苹果公司提供的持久化工具Core Data。在现实开发中,我们不需要处理大批量数据时,将不会采用SQLite和Core Data,这时只需要将对象实体做持久化保存就可,而对象类型可以通过NSCoding的委托方法来实现。本文是校级项目研究成果。编号为TP170205,题目是基于IOS环境下MVC模式成都学校资源APP设计与实现。

1 沙盒机制

IOS为每个应用程序都创建了一个文件系统结构去存储该应用程序的文件,此区域称为沙盒。沙盒作为一个文件系统结构,他可以存储声音、图像、文件等文件,并且每个应用程序只能访问自己沙盒内的数据,其他应用是无法访问的。在苹果系统中想要查看沙盒数据需要查看Library目录。在OS X10.7以后的版本,苹果公司默认隐藏了Library文件夹,因此打开Finder窗口后,需要按住Option键,并选择前往->资源库,向下找到Developer/CoreSimulator/devices/模拟器UDID/Data/Containers/Data/Application,可以看到模拟器中所有程序沙盒目录,每个应用都有自己的/Documents文件夹,且仅能读写各自/Documents目录中内容[1]。每个应用程序沙盒都应包含以下三个目录:

(1)Documents:应用程序可以将数据存储在Documents目录中,应用程序启用iTunes文件分享功能,则用户可以在iTunes中看到目录的内容,以及应用程序创建的所有子目录,还可以对其更新文件。

(2)Library:应用程序也可以在这里数据存储,存放不想分享给用户的文件,需要时可创建自己的子目录。

(3)tmp:供应存储临时文件,当iOS设备执行同步时,iTunes不会备份tmp中的文件,在不需要这些文件时,应用负责删除tmp中的文件,以免占用文件系统的空间。

随机打开一个应用沙盒,如图3所示。

从图1可以看出应用的名称看上去是随机的文件夹中,这时可以使用NSSearchPathForDirectoriesInDomain()来查找各种目录。该函数可以基于OS X平台的Cocoa共享,获取Document目录的部分代码:

Let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask,true)

letdocunmentsDirectory = path[0] as String

通过NSSearchPathDirectory.DocumentDirectory查找Document目录的路径,NSSearchPathDomainMask.UserDomainMask表示搜索限制在应用沙盒内。以上函数返回的是一个匹配路径的数字,但位于索引0处的一定是Document目录,因为每个应用只有Document目录,所以只有一个目录符合指定的条件。

2 对象归档概述

对象归档是将一个或者多个对象,采用序列化的方式保存到指定的文件,再以反序列化的方式從文件恢复成对象,整个过程有些类似于压缩和解压缩文件的过程。在对象归档技术中,有一个非常重要的协议NSCoding。凡是遵守了NSCoding协议的自定义对象都可以实现对象归档和反归档。类继承它,此类的实例才能被编码(encode)和解码(decode),继承了这个类,也就实现两个方法。这两个方法都是必需的,一个方法将对象编码到归档中:encode(with aCoder: NSCoder),另一个方法对归档解码用来创建一个新对象,init?(coder aDecoder: NSCoder)这两个方法都床底一个NSCoder实例,可以使用键值编码(Key-Value Coding)对对象和原生数据类型(如整形)进行编码和解码。

3 Swift实现采用对象归档实例分析

如图2学校展示界面所示,我们想存储当前页面上的展示的学校名字,地址,电话,网站,性质和区域数据,需要建立与数据对应的对象,然后通过NSCoding对数据进行读写。

1)先建立一个swift的school类文件专门用来做数据存放处理。如图3所示。

2)创建一个用于存储密钥字符串的结构。包括学校名,地址,电话,网址,学校性质,区域和照片。

//定义类型

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对象支持归档,需要让它成为NSObject(或任何继承与NSObject的其他类)的子类,需要建立一个简单容器类。

classSchool :NSObject,NSCoding {

//学校属性

var name : String

var address : String

vartel : String

var website : String

var property :String

var area : String

var photo : UIImage?

}

4)继承于NSCoding需要实现2个方法:encode(with aCoder: NSCoder),init?(coderaDecoder: NSCoder)

//从coder中读取数据,保存到相应的变量中,即反序列化数据

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)

}

//读取实例变量,并把这些数据写到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)創建一个路径去存放数据

那么应用位于一个名称看上去随机的文件夹中,应该如何检索Documents的完整路径,才能正确方便的读取和写入文件呢?我们可以使用FileManager定位到应用文件位置直接读写。将以下代码加入到之前建立的Swift文件。

//存储位置

static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!

static let ArchiveURL = DocumentsDirectory.appendingPathComponent(“school”)

4 结束语

在手机使用率越来越高的今天,为用户提供快而准的服务是每个行业发展的必然趋势,数据的快速存储可以明显提高软件性能,提高用户体验度,可想而知它在软件开发中的重要性之大。为了更好学习数据存储的知识,我们非常有必要对IOS中数据处理有一个深刻的认识,认识其重要性。未来,我们还将更好的使用数据存储技术,让其更好地为我们未来的工作生活服务,加快计算机信息化的发展。本文通过对对象归档技术的分析及实现希望能对正在做这部分的同行提供学习和借鉴。

参考文献:

[1] David Mark.精通IOS开发[M].人民邮电出版社,2016:301-314.

[2] 传智播客高教产品研发部[M].IOS开发项目化入门教程.人民邮电出版社,2017:236-254.

[3] 李伟梦. Swift编程入门经典[M]. 北京:清华大学出版社,2015.

[4] The Swift Programming Language (Swift 4.0.3).Language Guide.2017

[5] 李艳华. iOS平台上基于MVC的设计模式的“音悦台”的设计与实现[J].电子技术,2015(9).