model存储 swift_swift 本地存储model - CSDN
  • 2其次前提:保存的model要实现NSCoding 3.在自定义的类目实现这两个方法 -(void)setCustomObj:(id)obj forKey:(NSString *)key; -(id)customObjForKey:(NSString *)key; 在自定义的类目中实现这两个方法 -(void...

    1.先创建类目类:继承于NSUserDefaults

    2其次前提:保存的model要实现NSCoding

    3.在自定义的类目实现这两个方法

    -(void)setCustomObj:(id)obj forKey:(NSString *)key;

    -(id)customObjForKey:(NSString *)key;

    在自定义的类目中实现这两个方法

    -(void)setCustomObj:(id)obj forKey:(NSString *)key

    {

        if ([obj respondsToSelector:@selector(encodeWithCoder:)] == NO) {

            NSLog(@"对象存入失败!对象必须实现NSCoding 协议的 encodeWithCoder:方法");

            return;

        }

        NSData * encodeObject = [NSKeyedArchiver archivedDataWithRootObject:obj];

        NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

        [defaults setObject:encodeObject forKey:key];

        [defaults synchronize];

    }

     -(id)customObjForKey:(NSString *)key

    {

        NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];

        NSData * encodeObject = [defaults objectForKey:key];

        if (encodeObject == nil) {

            return nil;

        }

        id obj = [NSKeyedUnarchiver unarchiveObjectWithData:encodeObject];

        return obj;

    }

    4.再次来到我们保存model中实现NSCoding协议

    - (id)initWithCoder:(NSCoder *)decoder

    {

        self = [super initWithCoder:decoder];

        

        if (self) {

            self.cityId = [decoder decodeObjectForKey:@"cityId"];

            self.cityName = [decoder decodeObjectForKey:@"cityName"];

            self.cityLat = [decoder decodeObjectForKey:@"cityLat"];

            self.cityLng = [decoder decodeObjectForKey:@"cityLng"];

            self.firstCharacter = [decoder decodeObjectForKey:@"firstCharacter"];

            self.subsidiaryBankId = [decoder decodeObjectForKey:@"subsidiaryBankId"];

        }

        

        return self;

    }

     

    - (void)encodeWithCoder:(NSCoder *)aCoder

    {

        [aCoder encodeObject:self.cityId forKey:@"cityId"];

        [aCoder encodeObject:self.cityName forKey:@"cityName"];

        [aCoder encodeObject:self.cityLat forKey:@"cityLat"];

        [aCoder encodeObject:self.cityLng forKey:@"cityLng"];

        [aCoder encodeObject:self.firstCharacter forKey:@"firstCharacter"];

        [aCoder encodeObject:self.subsidiaryBankId forKey:@"subsidiaryBankId"];

     

    }

     5.最后来到控制器中,实例化类目,就可以实现保存model

     

    转载于:https://www.cnblogs.com/fantasy3588/p/4773777.html

    展开全文
  • 在处理Swift持久化内容的时候,使用到了NSUserDefaults来保存数据,但是在实现过程中发现正常的对象无法保存,会报很多错,对象如下(简单的Student对象) class Student { var name: String? var id: Int? }该...

    在处理Swift持久化内容的时候,使用到了NSUserDefaults来保存数据,但是在实现过程中发现正常的对象无法保存,会报很多错,对象如下(简单的Student对象)

    class Student {
      var name: String?
      var id: Int?
    }
    该对象在存储过程中,即如下方式存储时会报各种错误

    let student = Student()
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setObject(strDict, forKey: "strDict")
    defaults.synchronize()

    其中需要继承NSObject类和NSCoding类,并且需要重写NSObject类中的description属性(如果需要的话)和无参构造,NSCoding类中的

    requiredinit?(coder aDecoder: NSCoder)构造和

    encodeWithCoder(aCoder:NSCoder)方法

    改造如下:

    class Student: NSObject, NSCoding{
        var name: String?
        var id: Int?
        override var description: String {
            get {
                return "name: " + name! + "  id: \(id)"
            }
        }
        
        override init() {
            
        }
        
        required init?(coder aDecoder: NSCoder) {
            self.id = aDecoder.decodeObjectForKey("id") as? Int
            self.name = aDecoder.decodeObjectForKey("name") as? String
        }
        
        func encodeWithCoder(aCoder: NSCoder) {
            aCoder.encodeObject(name, forKey: "name")
            aCoder.encodeObject(id, forKey: "id")
        }
    }
    
    无参构造不必实现什么或者赋值什么,如果你想在构造时就对对象属性赋值也可以重写有参构造

    改造完毕之后借助NSData来实现在NSUserDefaults中对象的保存,代码如下所示:这里仅以Array类型作为示例,当类继承了NSObject和NSCoding后,对象,Array,Dictionary均能正常的存储

    var students = [Student]()
    students.append(student1)
    students.append(student2)
    students.append(student3)
                
    let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(students)
    defaults.setObject(data, forKey: "array")
    下面这句话我也在网上查了好多资料,其实是写不写都一样,只是用来保证在异常关闭前能存储正常
    defaults.synchronize()
    读取方式如下:

    let one = defaults.objectForKey("array") as? NSData
    if one != nil {
    <span style="white-space:pre">	</span>let student = NSKeyedUnarchiver.unarchiveObjectWithData(one!)
    <span style="white-space:pre">	</span>print((student as! [Student]).description)
    }

    以上,本人初学Swift,如有错误的地方,还请不吝指正,多谢


    展开全文
  • 1.对用户的模型数据(自定义类:HCUserModel)进行归档和解档 1.1 需要遵循NSCoding协议 1.2 需要实现func encode(with aCoder: NSCoder){}归档方法 ...1.3需要实现 required init(coder aDecoder: NSCoder){}...

    1.对用户的模型数据(自定义类:HCUserModel)进行归档和解档

    1.1 需要遵循NSCoding协议

    1.2 需要实现func encode(with aCoder: NSCoder){}归档方法

    1.3需要实现 required init(coder aDecoder: NSCoder){}解档方法

    1.4 重写init方法

    2.HCUserModel的数据内容如下:

    import UIKit


    class HCUserModel: NSObject,NSCoding {

        

        var id:Int?

        var nickname:String?

        var phone:String?

        var account:String?

        var password:String?

        var type:Int?

        var icon:String?

        var attentionnumber:Int?

        var registertime:String?

        var qrcode:String?

        var signature:String?

        var dynamicstruts:Int?

        var score:Int?

        

        // MARK:- 处理需要归档的字段

        func encode(with aCoder:NSCoder) {

            

            aCoder.encode(id, forKey:"id")

            aCoder.encode(nickname, forKey:"nickname")

            aCoder.encode(phone, forKey:"phone")

            aCoder.encode(account, forKey:"account")

            aCoder.encode(password, forKey:"password")

            aCoder.encode(type, forKey:"type")

            aCoder.encode(icon, forKey:"icon")

            aCoder.encode(attentionnumber, forKey:"attentionnumber")

            aCoder.encode(registertime, forKey:"registertime")

            aCoder.encode(qrcode, forKey:"qrcode")

            aCoder.encode(signature, forKey:"signature")

            aCoder.encode(dynamicstruts, forKey:"dynamicstruts")

            aCoder.encode(score, forKey:"score")

        }

        

        // MARK:- 处理需要解档的字段

        requiredinit(coder aDecoder:NSCoder) {

            super.init()

            id = aDecoder.decodeObject(forKey:"id")as?Int

            nickname = aDecoder.decodeObject(forKey:"nickname")as?String

            phone = aDecoder.decodeObject(forKey:"phone")as?String

            account = aDecoder.decodeObject(forKey:"account")as?String

            password = aDecoder.decodeObject(forKey:"password")as?String

            type = aDecoder.decodeObject(forKey:"type")as?Int

            icon = aDecoder.decodeObject(forKey:"icon")as?String

            attentionnumber = aDecoder.decodeObject(forKey:"attentionnumber")asInt

            registertime = aDecoder.decodeObject(forKey:"registertime")as?String

            qrcode = aDecoder.decodeObject(forKey:"qrcode")as?String

            signature = aDecoder.decodeObject(forKey:"signature")as?String

            dynamicstruts = aDecoder.decodeObject(forKey:"dynamicstruts")asInt

            score = aDecoder.decodeObject(forKey:"score")as?Int

        }

        overrideinit() {

            super.init()

        }

    }


    3. 实现归档把模型保存到本地Document文件夹:
    3.1 获取本地Document路径,一般路径都设为全局变量,方便解档直接使用:

    let userAccountPath ="\(NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,

    FileManager.SearchPathDomainMask.userDomainMask,true).first!)/userAccount.data"


    3.2 对获取到的模型进行归档操作,要注意模型必须是确定的类型,如果是可选类型会报发送未识别的消息的错误(切记)

    NSKeyedArchiver.archiveRootObject(userModel!, toFile:userAccountPath)


    4.实现解档从Document文件夹获取本地模型数据

    4.1 判断Document文件夹下是否有已保存好的模型,有的话就解档取出模型

     if NSKeyedUnarchiver.unarchiveObject(withFile:userAccountPath) !=nil {

                

                userModel =NSKeyedUnarchiver.unarchiveObject(withFile:userAccountPath)asHCUserModel

            }


    展开全文
  • 答案是: 模型(专门存放数据的对象)其实就是一个用来存储和读取你网络请求获取到的数据的容器,用来存放和读取你的数据,数据模型,专门用来存放数据的对象,用它来表示数据会更加专业 模型设置数据和取出数据都是...

    经常在开发中将字典,JSON或者其他的数据类型转成模型,那模型的作用是什么呢? 为什么不直接将获取到的数据赋值给对应的显示控件呢?

    答案是: 模型(专门存放数据的对象)其实就是一个用来存储和读取你网络请求获取到的数据的容器,用来存放和读取你的数据,数据模型,专门用来存放数据的对象,用它来表示数据会更加专业

    模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性

    使用模型访问属性时,编译器会提供一系列的提示,提高编码效率

    例子:
    
    cell类中:
      //cell中控件  contentlabel 
      var contentlabel:UILabel?
    
      class CellModel{
         var content;String = ""
       //初始化方法
       init(labelString: String){
         self.content = labelString
      }
    }
    
    func setCell(_ model: cellModel){
        self.contentlabel.text = model.content
    }
    
    
    View中:
    //假设网络请求获取到的数据为 getResponse(String类型)
    let source:String = getResponse
    //注意要转模型了
    let model:CellModel = CellModel(content: "source")
    let endModel = model
    
    //对数组,元组,或者其他结构复杂的数据是同理,自己慢慢捋一捋
    
    
    展开全文
  • 背景 JSON是移动端开发常用的应用层数据交换协议。最常见的场景便是,客户端向服务端发起网络请求,服务端返回JSON文本,然后客户端解析这个JSON文本,再把对应数据展现到页面上。 但在编程的时候,处理JSON是一件...
  • 对象存储系统Swift技术详解:综述与概念 ... Object Storage (Swift) 是用来创建冗余的、可扩展的对象存储(引擎)的开源软件。通过阅读Swift的技术文档,我们可以理解其中的设计的原理和实现的方法 
  • 联系人:石虎 QQ:1224614774 昵称: 嗡嘛呢叭咪哄  QQ群:807236138 群称: iOS 技术交流学习群   一、概念 UserDefaults 适合存储轻量级的本地客户端数据,比如记住密码功能,要保存...使用 UserDefaults 是首选。...
  • 结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Model { var title :String var url :String ...
  • swift 工程中要保存类对象数组,经综合考虑选用UserDefaults 及 NSSecureCoding 保存类对象数组。首先定义类: class TimeData:NSObject, NSSecureCoding { static var supportsSecureCoding: Bool { return true...
  • 我们先看看使用归档和解档需要遵守的几个条件 条件: 归档解档存储的对象...这是一个牺牲,不想继承的使用UserDafult方法去存储,毕竟Swift里面少点oc东西好 如果想通过运行时一次获得所有属性列表,更方便的进行...
  • 一直木有看过这个细节,用UserDefaults是能不能存复杂一点的对象。大家可能都看到过UserDefaults的一个方法setObject: forKey:,用这个方法存过NSDictionary,NSArray什么的,也存过字符串。 偶然一次直接存了一个...
  • NSUserDefaults适合存储轻量级的...使用NSUserDefaults是首选。... ...一般来说本地存储数据我们还可以是用SQlite数据库,或者使用自己建立的plist文件什么的,但这还得自己显示创建文件,读取文件,很麻烦,而是用NSUs
  • 基于YYModel的轻量级高效归档缓存框架CBArchiver(Lightweight and efficient archiving caching framework based on YYModel)
  • 有时会需要存储N×N数组的数据模型(如3×3,4×4等)。这里我们演示了三种实现方式,分别是:一维数组、仿二维数组、自定义二维数组(即矩阵结构)。 功能是根据传入维度初始化数组,同时提供设置值和打印输出所有...
  • 基本使用方法: let defaults = UserDefaults.standard 添加 defaults.set(123, forKey: "defaultKey") 获取 defaults.integer(forKey: "defaultKey") ...对此方法进行封装 调用 ...
  • If you create an instance of a structure and assign that instance to a constant, you cannot modify the instance’s properties, even if they were declared as variable properties: 如果你创建一个结构体...
  • 1.创建一个数据库的工具类 import UIKit import FMDB class XBDataManger: NSObject { //单例 static let shareInstance : XBDataManger = XBDataManger() //创建一个队列(线程安全的队列) ...
  • swift_类和结构体

    2016-07-23 16:34:49
    /**  *  类和结构体的对比 ... 与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面
  • 本文旨在帮助开发者快速从OC开发过渡到Swift开发,挑选了一些比较浅显的但是比较常用的Swift语法特性,在介绍的过程中,通常会拿OC中的语言特性作比较,让大家更好的注意到Swift的不同。 另外需要说明的是,笔者也...
  • OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性、冗余和持久性。本文将从架构、原理和实践等几方面讲述SwiftSwift并不是文件系统或者实时的数据...
1 2 3 4 5 ... 20
收藏数 2,952
精华内容 1,180
关键字:

model存储 swift