iOS - Swift NSKeyedArchiver 数据归档

前言

    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()
时间: 2024-08-15 12:01:25

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

iOS - OC NSKeyedArchiver 数据归档

前言 @interface NSKeyedArchiver : NSCoder @interface NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象.通常,这个过程包括将(多个)对象写入文件中,以便以后读取该对象.可以使用归档的方法进行对象的深复制. 采用归档的形式来保存数据,该数据对象需要遵守 NSCoding 协议,并且该对象对应的类必须提供 encodeWithCoder: 和 initWit

iOS - Swift PList 数据存储

前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如果要变动数据,直接修改数据文件即可,不用修改代码.一般可以使用属性列表文件存储 NSArray 或者 NSDictionary 之类的数据,这种 "属性列表文件" 的扩展名是 plist,因此也称为 "plist 文件". plist 是以 xml 文件形式存储的. 如

iOS - Swift NSData 数据

前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public class NSMutableData : NSData NSData 和它的可变长子类 NSMutableData 是字节缓冲区的对象化封装.我们可以获得简单缓冲区,并进行一些转换操作.通常我们并不会直接创建字节数据,而是从其他类型的内容转换成字节数据. 所谓简单缓冲区,就是缓冲区内只包含数据,无内嵌指针. 1.NSData

iOS - Swift NSUserDefaults 数据存储

前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults 里存了一个可变数组,取出来的时候这个数组对象就变成了不可变的. NSUserDefaults 可以存储的数据类型包括:NSData.NSString.NSNumber.NSDate.NSArray.NSDictionary.如果要存储其他类型,则需要转换为前面的类型,才能用 NSUserDefa

IOS swift 异步加载数据,并显示一个进度条

问题描述 IOS swift 异步加载数据,并显示一个进度条 网络获取数据使用的是NSURLConnection,异步请求.这个数据已经能够获得了.现在想要实现的是,通过登录界面输入账号什么的,点击提交按钮可以在显示进度条的同时执行post请求得到数据,如果这个数据不为空进度条消失并登录成功回到主界面,否者就提示有错. 希望小伙伴给个简单的例子,这样会更好理解 这个在安卓中是用AsyncTask实现的..线程一直都理不清,还请小伙伴们多多指导.谢谢!!!!! 解决方案 http://www.it

iOS开发之数据存储之NSKeyedArchiver

1.概述 NSKeyedArchiver归档和plist文件存储不同的是NSKeyedArchiver可以直接保存对象.如果对象是NSString.NSDictionary.NSArray.NSData.NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以被存储. NSCoding协议中的2个方法: (1)encodeWithCoder: 存对象时该方法必须实现,每次归档对象时,都会

iOS - Swift Foundation 框架

前言 框架是由许多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使研发程序更容易. Foundation 框架:为所有程序开发奠定基础的框架称为 Foundation 框架. Cocoa :是指 Foundation .Core Data 和 AppKit(Application Kit)框架.用于 Mac OS X 设备上的应用程序开发. Cocoa Touch :是指 Foundation .Core Data 和 UIKit 框架.用于 iOS 设备上的应用程序开发. 1.Found

[译] 原生 iOS(Swift) 和 React-Native 的性能比较

本文讲的是[译] 原生 iOS(Swift) 和 React-Native 的性能比较, 原文地址:Comparing the Performance between Native iOS (Swift) and React-Native 原文作者:John A. Calderaio 译文出自:掘金翻译计划 译者:Deepmissea 校对者:gy134340,Danny1451 原生 iOS(Swift) 和 React-Native 的性能比较 React-Native 是一个混合的移动框架

iOS开发系列--数据存取

概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录.当然,文件存储并不作为本文的重点内容.本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以