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

下面通过一个例子将联系人数据保存到沙盒的“documents”目录中。(联系人是一个数组集合,内部为自定义对象)。

功能如下:

1,点击“保存”将联系人存入userList.plist文件中

2,点击“读取”从数据文件中加载解析出联系人

注意:

1,本例使用了NSCoder,这个封装了许多技术细节,使用它我们可以很轻易的将对象写到文件中,也可以用它将文件中的对象转换回来。

2,自定义对象必须添加如下两个方法,这个才能顺利的被序列化编码存储和读取。


1

2

3

4

5

6

7

8

9

10

11

//从nsobject解析回来

init(coder aDecoder:NSCoder!){

    self.name=aDecoder.decodeObjectForKey("Name") as String

    self.phone=aDecoder.decodeObjectForKey("Phone") as String

}

//编码成object

func encodeWithCoder(aCoder:NSCoder!){

    aCoder.encodeObject(name,forKey:"Name")

    aCoder.encodeObject(phone,forKey:"Phone")

}

具体代码如下:

--- 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()

        // Do any additional setup after loading the view, typically from a nib.

        

        //初始化模拟数据

        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()

    }

    

    //读取数据

    @IBAction func loadData(sender:AnyObject) {

        dataModel.loadData()

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

}

--- 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

import UIKit

class DataModel: NSObject {

    

    var userList = [UserInfo]()

    

    override init(){

        super.init()

        println("沙盒文件夹路径:\(documentsDirectory())")

        println("数据文件路径:\(dataFilePath())")

    }

    

    //保存数据

    func saveData() {

        var data = NSMutableData()

        //申明一个归档处理对象

        var archiver = NSKeyedArchiver(forWritingWithMutableData: data)

        //将lists以对应Checklist关键字进行编码

        archiver.encodeObject(userList, forKey: "userList")

        //编码结束

        archiver.finishEncoding()

        //数据写入

        data.writeToFile(dataFilePath(), atomically: true)

    }

    

    //读取数据

    func loadData() {

        //获取本地数据文件地址

        let path = self.dataFilePath()

        //声明文件管理器

        let defaultManager = NSFileManager()

        //通过文件地址判断数据文件是否存在

        if defaultManager.fileExistsAtPath(path) {

            //读取文件数据

            let data = NSData(contentsOfFile: path)

            //解码器

            let unarchiver = NSKeyedUnarchiver(forReadingWithData: data!)

            //通过归档时设置的关键字Checklist还原lists

            userList = unarchiver.decodeObjectForKey("userList") as Array

            //结束解码

            unarchiver.finishDecoding()

        }

    }

    

    //获取沙盒文件夹路径

    func documentsDirectory()->String {

        var paths = NSSearchPathForDirectoriesInDomains(

            NSSearchPathDirectory.DocumentationDirectory,NSSearchPathDomainMask.UserDomainMask,true)

        var documentsDirectory:String = paths.first as String

        return documentsDirectory

    }

    

    //获取数据文件地址

    func dataFilePath ()->String{

        return self.documentsDirectory().stringByAppendingString("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

25

import UIKit

class UserInfo: NSObject {

    var name:String

    var phone:String

    

    //构造方法

    init(name:String="",phone:String=""){

        self.name = name

        self.phone = phone

        super.init()

    }

    

    //从nsobject解析回来

    init(coder aDecoder:NSCoder!){

        self.name=aDecoder.decodeObjectForKey("Name") as! String

        self.phone=aDecoder.decodeObjectForKey("Phone") as! String

    }

    

    //编码成object

    func encodeWithCoder(aCoder:NSCoder!){

        aCoder.encodeObject(name,forKey:"Name")

        aCoder.encodeObject(phone,forKey:"Phone")

    }

}

时间: 2024-10-18 18:12:04

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

SWIFT中将信息保存到plist文件内

在项目中可能我们需要保存一些数据到plist文件中,以下就本人在学习过程中的笔记,不成熟的地方请指出. 可能我有一个类叫做Student import UIKit class Student: NSObject { var text:String var age:Bool init(text:String,age:Int) { self.text = text self.age = age } //从nsobject中解析回来 init(coder aDecoder:NSCoder){ self

Listview滑动时不加载数据,停下来时加载数据,让App更优

数据源配置(Adapter) package com.zhengsonglan.listview_loading.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Im

Liger UI 表格数据查找/通过条件加载数据

api上的例子是在本地过滤的,无法使用,自己摸索了一下. javascript代码: ? 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 //初始化ligerui控件 $(function (){         maingrid = $("#maingrid").ligerGrid({             columns: [                 {

[深度学习] Pytorch(三)—— 多/单GPU、CPU,训练保存、加载模型参数问题

[深度学习] Pytorch(三)-- 多/单GPU.CPU,训练保存.加载预测模型问题 上一篇实践学习中,遇到了在多/单个GPU.GPU与CPU的不同环境下训练保存.加载使用使用模型的问题,如果保存.加载的上述三类环境不同,加载时会出错.就去研究了一下,做了实验,得出以下结论: 多/单GPU训练保存模型参数.CPU加载使用模型 #保存 PATH = 'cifar_net.pth' torch.save(net.module.state_dict(), PATH) #加载 net = Net()

sklearn训练模型的保存与加载

使用joblib模块保存于加载模型 在机器学习的过程中,我们会进行模型的训练,最常用的就是sklearn中的库,而对于训练好的模型,我们当然是要进行保存的,不然下次需要进行预测的时候就需要重新再进行训练.如果数据量小的话,那再重新进行训练是没有问题的,但是如果数据量大的话,再重新进行训练可能会花费很多开销,这个时候,保存好已经训练的模型就显得特别重要了.我们可以使用sklearn中的joblib模块进行保存与加载. from sklearn.externals import joblib # 保

远程访问本地的网站 网站样式加载不上

远程访问本地的网站 网站样式加载不上(MLECMS2.3) 找到项目中的配置文件 修改配置文件中的localhost为本地的IP地址,一般是192.168.0.***

tensorflow 之模型的保存与加载(一)

怎样让通过训练的神经网络模型得以复用? 本文先介绍简单的模型保存与加载的方法,后续文章再慢慢深入解读. 1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ############################ 4 #File Name: saver.py 5 #Brief: 6 #Author: frank 7 #Mail: [email protected] 8 #Created Time:2018-06-22 22:12:52 9 ###

tensorflow 之模型的保存与加载(三)

前面的两篇博文 第一篇:简单的模型保存和加载,会包含所有的信息:神经网络的op,node,args等; 第二篇:选择性的进行模型参数的保存与加载. 本篇介绍,只保存和加载神经网络的计算图,即前向传播的过程. #!/usr/bin/env python3 #-*- coding:utf-8 -*- ############################ #File Name: save_restore.py #Brief: #Author: frank #Mail: [email protect

tensorflow模型的保存与加载

模型的保存与加载一般有三种模式:save/load weights(最干净.最轻量级的方式,只保存网络参数,不保存网络状态),save/load entire model(最简单粗暴的方式,把网络所有的状态都保存起来),saved_model(更通用的方式,以固定模型格式保存,该格式是各种语言通用的) 具体使用方法如下: # 保存模型 model.save_weights('./checkpoints/my_checkpoint') # 加载模型 model = keras.create_mod