前言

	public class NSKeyedArchiver : NSCoder
public class NSKeyedUnarchiver : NSCoder
  • 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象。可以使用归档的方法进行对象的深复制。

  • 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWithCoder: 方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。

  • 缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。

1、系统类的归档/反归档

	// 文件路径
let achiverPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/stringAchiverFile") // 待归档的数据
let string:String = "bei jing huan yin nin" // 归档,归档到文件
let bl:Bool = NSKeyedArchiver.archiveRootObject(string, toFile: achiverPath) // 反归档,从文件反归档
let strFromAchiverFile:AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithFile(achiverPath)!

2、自定义类的归档/反归档

  • Dog.swift

    	// 遵守 NSCoding 协议
    class Dog: NSObject, NSCoding { var name:String
    var age:Int init(name:String, age:Int) {
    self.name = name
    self.age = age
    } // 归档 方法
    func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.name, forKey: "name")
    aCoder.encodeInteger(self.age, forKey: "age")
    } // 反归档 方法
    required init(coder aDecoder: NSCoder) { self.name = aDecoder.decodeObjectForKey("name") as! String
    self.age = aDecoder.decodeIntegerForKey("age")
    } override var description: String{
    return String(format: "%@, %d", self.name , self.age)
    }
    }
  • main.swift

    	// 文件路径
    let achiverPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/dogAchiverFile") // Dog 类需要遵守 NSCoding 协议,并实现其协议方法
    let dog:Dog = Dog(name: "xiao hei", age: 2) // 归档 // 归档到文件
    let bl:Bool = NSKeyedArchiver.archiveRootObject(dog, toFile: achiverPath) // 反归档 // 从文件反归档
    let dogFromAchiverFile:AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(achiverPath)!

3、NSKeyedArchiver 序列化

  • main.swift

    	// 文件路径
    let archiverPath:String = NSHomeDirectory().stringByAppendingString("/Desktop/catAchiverFile") // Cat 类不需要遵守 NSCoding 协议
    let cat1:Cat = Cat(name: "xiao bai", age: 1) var cat2:Cat = Cat(name: "", age: 0) // 归档,编码 // 设置数据区域
    let archiverData:NSMutableData = NSMutableData() // 开始存储对象,编码 // 将数据区域链接到 NSKeyedArchiver 对象
    let archiver:NSKeyedArchiver = NSKeyedArchiver(forWritingWithMutableData: archiverData) // 编码
    archiver.encodeInteger(cat1.age, forKey: "age") // 编码完成
    archiver.finishEncoding() // 将存档的数据写入文件
    let bl:Bool = archiverData.writeToFile(archiverPath, atomically: true) // 反归档,解码 // 设置数据区域
    let unarchiverDataArea:NSData = NSData() // 解码存储在归档文件中的对象 // 将数据区域链接到 NSKeyedUnarchiver 对象
    let unarchiver:NSKeyedUnarchiver = NSKeyedUnarchiver(forReadingWithData: unarchiverDataArea) // 解码
    cat2.age = unarchiver.decodeIntegerForKey("age") // 解码完成
    unarchiver.finishDecoding()

iOS - Swift NSKeyedArchiver 数据归档的更多相关文章

  1. iOS - OC NSKeyedArchiver 数据归档

    前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种 ...

  2. NSKeyedArchiver数据归档

    前言 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象. 通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. ...

  3. iOS - Swift PList 数据存储

    前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...

  4. iOS - Swift NSUserDefaults 数据存储

    前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefault ...

  5. iOS - Swift NSData 数据

    前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public class NSMutabl ...

  6. iOS开发 - 数据归档与恢复 NSKeyedArchiver

    归档与恢复归档 归档,英文Archiver['ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块. 恢复归档.英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢 ...

  7. IOS NSKeyedArchiver(归档存取数据)

    如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类 型,可以直接用NSKeyedArchiver进行归档和恢复 不是所有的对象都可以直接用这种方法 ...

  8. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  9. ios开发之数据存储

    iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core Data 应用沙盒 ...

随机推荐

  1. SQL Server 复制 订阅与发布

    SQL Server 复制 订阅与发布 通过SQL Server 2008数据库复制实现数据库同步备份 SqlServer2008 数据库同步的两种方式(Sql JOB) SqlServer2008 ...

  2. ExtJS的MessageBox总结

    自己写了个ExtJS的MsgBox的小模版,以后遇到需要使用提示的地方就拿过来改改,免得每次都重新写. /**MsgBox start**/ Ext.Msg.buttonText.yes = &quo ...

  3. PHP和Java的主要区别有哪些呢?

    解释 PHP与Java作为两种截然不同的程序开发语言,无论是技术层面还是发展空间,亦或是市场份额占比,都有着不同的表现方式,理念上的不同导致了Java和PHP在Web应用开发上显示了不同的结果.若要一 ...

  4. Codeforces 743D:Chloe and pleasant prizes(树形DP)

    http://codeforces.com/problemset/problem/743/D 题意:求最大两个的不相交子树的点权和,如果没有两个不相交子树,那么输出Impossible. 思路:之前好 ...

  5. VS中遇到的奇怪问题

    8.错误 C2440: “static_cast”: 无法从“void (__thiscall CView::* )(UINT,LONG)”转换为“LRESULT (__thiscall CWnd:: ...

  6. 用canvas画时钟

    效果图在博客首页上. html: <canvas id="canvas" >Your browser does not support canvas</canva ...

  7. dbms_job.submit 单次执行

    DBMS_JOB.SUBMIT用于定时任务,基本用法如下: DBMS_JOB.SUBMIT(:jobno,//job号                                      'yo ...

  8. StringBuffer中的flush()方法作用

    在java API1.6对flush()方法的介绍如下: 方法摘要  void close()           关闭此流,但要先刷新它.  void flush()           刷新该流的 ...

  9. 20150624_Andriod _web_service_匹配

    using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...

  10. git status message - Your branch is ahead of origin/master by X commits

    git reset --hard origin/master git status FAQ: When I issue the "git status" command, I se ...