iOS - Swift NSKeyedArchiver 数据归档

简介: 前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder在 OC 语言中,归档是一个过程,即用某种格式来保存一个或多个对象,以便以后还原这些对象。

前言

    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()
目录
相关文章
|
4月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
100 2
|
4月前
|
存储 iOS开发 开发者
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
使用克魔助手进行iOS数据抓包和HTTP抓包的方法详解
47 0
|
3天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
12 0
|
3天前
|
API 数据库 Swift
【Swift开发专栏】Swift中的数据持久化:Core Data与Realm
【4月更文挑战第30天】本文探讨了Swift中两种流行的数据持久化框架——Core Data和Realm。数据持久化是保持应用数据在不同运行周期间一致性的关键。Core Data,苹果的ORM系统,适合处理复杂数据关系,提供与iOS生态系统的无缝集成。使用Core Data涉及定义数据模型、生成NSManagedObject子类、配置持久化容器及执行数据操作。而 Realm,一个轻量级数据库,以其高性能、易于使用的API和实时数据同步适用于跨平台项目。在Swift中使用Realm,需定义数据模型、配置Realm实例、执行数据操作并观察数据变化。理解这两者能帮助开发者构建更高效、可靠的应用。
|
3天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
3天前
|
存储 安全 Swift
【Swift 开发专栏】使用 Swift 开发一个简单的 iOS 应用
【4月更文挑战第30天】本文介绍了使用 Swift 开发简单 iOS 待办事项应用的步骤。首先,阐述了 iOS 开发的吸引力及 Swift 语言的优势。接着,详细说明了应用的需求和设计,包括添加、查看和删除待办事项的功能。开发步骤包括创建项目、界面搭建、数据存储、功能实现,并提供了相关代码示例。最后,强调了实际开发中需注意的细节和优化,旨在帮助初学者掌握 Swift 和 iOS 开发基础。
|
26天前
|
移动开发 小程序 API
uniapp通过蓝牙传输数据 (ios)
uniapp通过蓝牙传输数据 (ios)
31 1
|
3月前
|
监控 API Swift
用Swift开发iOS平台上的上网行为管理监控软件
在当今数字化时代,随着智能手机的普及,人们对于网络的依赖日益增加。然而,对于一些特定场景,如家庭、学校或者企业,对于iOS设备上的网络行为进行管理和监控显得尤为重要。为了满足这一需求,我们可以利用Swift语言开发一款iOS平台上的上网行为管理监控软件。
211 2
|
4月前
|
Web App开发 网络安全 Android开发
🚀2023最新版克魔助手抓包教程(9) - 克魔助手 IOS 数据抓包
在移动应用程序的开发中,了解应用程序的网络通信是至关重要的。数据抓包是一种很好的方法,可以让我们分析应用程序的网络请求和响应,了解应用程序的网络操作情况。克魔助手是一款非常强大的抓包工具,可以帮助我们在 Android 和 iOS 平台上进行数据抓包。本篇博客将介绍如何使用克魔助手在 iOS 平台上进行数据抓包。
|
4月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
225 1

相关课程

更多