Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)

(本文代码已升级至Swift3) 

下面通过一个例子将联系人数据保存到沙盒的“ documents”目录中。(联系人是一个数组集合,内部为自定义对象)。
原文:Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)

1,样例功能

(1)点击“保存”将联系人存入  userList.plist 文件中
(2)点击“读取”从数据文件中加载解析出联系人

2,注意事项

(1)本例使用了  NSCoder,这个封装了许多技术细节,使用它我们可以很轻易的将对象写到文件中,也可以用它将文件中的对象转换回来。
(2)自定义对象必须添加如下两个方法,这个才能顺利的被序列化编码存储和读取。
1
2
3
4
5
6
7
8
9
10
11
//从object解析回来
required  init (coder decoder:  NSCoder ) {
     self .name = decoder.decodeObject(forKey:  "Name" as String  ??  ""
     self .phone = decoder.decodeObject(forKey:  "Phone" as String  ??  ""
}
 
//编码成object
func  encode(with coder:  NSCoder ) {
     coder.encode(name, forKey: "Name" )
     coder.encode(phone, forKey: "Phone" )
}

3,样例代码

--- ViewController.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import  UIKit
 
class  ViewController UIViewController  {
     
     var  dataModel =  DataModel ()
     
     override  func  viewDidLoad() {
         super .viewDidLoad()
         
         //初始化模拟数据
         onCreateData()
     }
     
     //创建模拟数据
     func  onCreateData(){
         dataModel.userList.append( UserInfo (name:  "张三" , phone:  "1234" ))
         dataModel.userList.append( UserInfo (name:  "李四" , phone:  "1212" ))
         dataModel.userList.append( UserInfo (name:  "航歌" , phone:  "3525" ))
     }
     
     //保存数据
     @IBAction  func  saveData(_ sender: AnyObject ) {
         dataModel.saveData()
         print ( "保存成功!" )
     }
     
     //读取数据
     @IBAction  func  loadData(_ sender: AnyObject ) {
         dataModel.loadData()
         print ( "读取成功!" , dataModel.userList)
     }
     
     override  func  didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
     }
}

--- DataModel.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import  UIKit
 
class  DataModel NSObject  {
     
     var  userList = [ UserInfo ]()
     
     override  init (){
         super . init ()
         print ( "沙盒文件夹路径:\(documentsDirectory())" )
         print ( "数据文件路径:\(dataFilePath())" )
     }
     
     //保存数据
     func  saveData() {
         let  data =  NSMutableData ()
         //申明一个归档处理对象
         let  archiver =  NSKeyedArchiver (forWritingWith: data)
         //将lists以对应Checklist关键字进行编码
         archiver.encode(userList, forKey:  "userList" )
         //编码结束
         archiver.finishEncoding()
         //数据写入
         data.write(toFile: dataFilePath(), atomically:  true )
     }
     
     //读取数据
     func  loadData() {
         //获取本地数据文件地址
         let  path =  self .dataFilePath()
         //声明文件管理器
         let  defaultManager =  FileManager ()
         //通过文件地址判断数据文件是否存在
         if  defaultManager.fileExists(atPath: path) {
             //读取文件数据
             let  url =  URL (fileURLWithPath: path)
             let  data = try!  Data (contentsOf: url)
             //解码器
             let  unarchiver =  NSKeyedUnarchiver (forReadingWith: data)
             //通过归档时设置的关键字Checklist还原lists
             userList = unarchiver.decodeObject(forKey:  "userList" as Array
             //结束解码
             unarchiver.finishDecoding()
         }
     }
     
     //获取沙盒文件夹路径
     func  documentsDirectory()-> String  {
         let  paths =  NSSearchPathForDirectoriesInDomains (.documentDirectory,
                                                         .userDomainMask,  true )
         let  documentsDirectory = paths.first!
         return  documentsDirectory
     }
     
     //获取数据文件地址
     func  dataFilePath ()-> String {
         return  self .documentsDirectory().appendingFormat( "/userList.plist" )
     }
}

--- UserInfo.swift ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import  UIKit
 
class  UserInfo NSObject NSCoding  {
     var  name: String
     var  phone: String
     
     //构造方法
     required  init (name: String = "" , phone: String = "" ) {
         self .name = name
         self .phone = phone
     }
     
     //从object解析回来
     required  init (coder decoder:  NSCoder ) {
         self .name = decoder.decodeObject(forKey:  "Name" as String  ??  ""
         self .phone = decoder.decodeObject(forKey:  "Phone" as String  ??  ""
     }
     
     //编码成object
     func  encode(with coder:  NSCoder ) {
         coder.encode(name, forKey: "Name" )
         coder.encode(phone, forKey: "Phone" )
     }
}

4,运行效果

(1)点击“保存”按后,可以看到应用的  documents 目录下便新建了个  userList.plist 文件。
原文:Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)

(2)打开  userList.plist 文件,可以看到联系人数据已经成功保存到里面了。
原文:Swift - 本地数据的保存与加载(使用NSCoder将对象保存到.plist文件)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值