美文网首页
通过NSArchiver保存应用数据

通过NSArchiver保存应用数据

作者: alanhoo74 | 来源:发表于2022-03-05 13:02 被阅读0次

    iOS应用有很多保存数据的方式,一般应用的配置可以采用info.plist的方式保存,重量级的数据用sqllite的方式,用NSArchiver则是一个折衷的方法。

    NSArchiver实际是以二进制文件的方式,保存用户的数据。即先将用户的数据(例如对象、数组等)转化成二进制流,然后(归档)保存到文件中,相反的过程就是从文件中读取二进制流数据,(解码)恢复到对应的用户变量中。

    这里涉及两个知识点:设置文件和二机制归档以解码。

    设置文件

    iOS的文件一般在应用的沙盒SandBox目录下,定义的方式如下:

    let documentsDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = documentsDirectories.first!
    storageArchieveURL = documentDirectory.appendingPathComponent("\storage.dat")
    

    这样就返回一个全路径的文件名,后续可以使用该文件名保存和读取数据。

    二进制归档

    需要保存的数据必须符合NSCoding协议,为保险起见,最好继承NSObject(虽然不知道有什么用),这样iOS可以进行归档。这种归档操作是层级递进的,例如一个数组可以归档,则该数组的元素的类型必须符合NSCoding协议,如果这些元素是对象,那么该对象的各个属性的类型也必须符合NSCoding协议,以此类推...

    #保存数据
    do {
        let data = try NSKeyedArchiver.archivedData(withRootObject: someData, requiringSecureCoding: false)
        try data.write(to: storageArchieveURL)
                //保存成功
        } catch {
               //保存失败
       }
    }
    
    #读取数据
    do {
        let data = try Data(contentsOf: storageArchieveURL)
        if let retrieveData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as?  TypeOfSomeData {
        #解码成功
        } else {
        #解码失败
    }
    catch {
        #读数据失败
    }
    

    期间遇到一个问题,如果是枚举类型enum,则无法设置为符合NSCoding协议,解决方法就是定义的enum类型原始值类型符合NSCoding,例如String或者Int。

    enum SomeEnumType: String {
      case VALUE1 = "数值1"
      case VALUE2 = "数值2"
      case VALUE3 = "数值3"
    }
    

    相关文章

      网友评论

          本文标题:通过NSArchiver保存应用数据

          本文链接:https://www.haomeiwen.com/subject/diavrrtx.html