Swift数据存储(一)

前言:在我们开发过程中,不管是你做啥子应用,都要遇到数据的保存问题。将数据保存本地,这样让程序的运行更加流畅,不在出现小菊❀这样的╮(╯﹏╰)╭东东了,使得用户体验更好! 以下将介绍NSUserDefaults/ NSKeyedArchiver/ write写入方式.

文件操作知识临时充饥看我上篇文章:Swift文件管理必知的一些操作

1.使用NSUserDefaults存储数据

NSUserDefaults:一般我们拿它用来保存应用程序设置和属性、用户保存的数据,用户的手机不管是关机or开机时候都会保存在本地(除非你把他删除了),它一般可以存储类型包括:字符,数组,字典,NSData,NSNumber以及基本数据类型都可.那就来看看咋的实现它吧!
这里我简单的对其简单封装了一下方法,我就直接贴代码了,重要位置我都加了注释(ps:想看比较全面的可以参考这篇文章Swift之一步一步带你封装一个本地缓存库):

    /*  使用NSUserDefaults对普通数据对象储存   */
    
    /**
     储存
     
     - parameter key:   key
     - parameter value: value
     */
    class func setNormalDefault(key:String, value:AnyObject?){
        if value == nil {
            NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
        }
        else{
            NSUserDefaults.standardUserDefaults().setObject(value, forKey: key)
            // 同步
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }
    
    /**
     通过对应的key移除储存
     
     - parameter key: 对应key
     */
    class func removeNormalUserDefault(key:String?){
        if key != nil {
            NSUserDefaults.standardUserDefaults().removeObjectForKey(key!)
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }
    
    /**
     通过key找到储存的value
     
     - parameter key: key
     
     - returns: AnyObject
     */
    class func getNormalDefult(key:String)->AnyObject?{
        return NSUserDefaults.standardUserDefaults().valueForKey(key)
    }
  

下面举个简单 looklook

private func userDefaultStoreData(){
        Tool.setNormalDefault("name", value: "Rookie")
        let value = Tool.getNormalDefult("name")
        print("测试NSUserDefaults 简单对象储存\\(value)")
    }

//   控制台输出: **测试****NSUserDefaults ****简单对象储存****Optional(Rookie)**

2.通过write写入方式存储为plist属性列表
write写入方式也是一种把数据永久保存在磁盘中储存方式,一般步骤:1)获取路径(一般有两种方式:使用NSSearchPathForDirectoriesInDomains或URLsForDirectory;使用NSHomeDirectory➕相应的路径);2)向文件中写入数据;3)从文件中读取数据. 具体代码如下:

    /**
     创建文件
     
     - parameter name:        文件名
     - parameter fileBaseUrl: url
     
     - returns: 文件路径
     */
   class func creatNewFiles(name:String, fileBaseUrl:NSURL) -> String{
        let manager = NSFileManager.defaultManager()
        let file = fileBaseUrl.URLByAppendingPathComponent(name)
        
        let exist = manager.fileExistsAtPath(file.path!)
        if !exist {
            let createFilesSuccess = manager.createFileAtPath(file.path!, contents: nil, attributes: nil)
            print("文件创建结果: \\(createFilesSuccess)")
        }
        return String(file)
    }
    
    /**
     读取文件
     
     - parameter name:        文件名
     - parameter fileBaseUrl: url
     
     - returns: 读取数据
     */
    class func readTheFlies(name:String , fileBaseUrl:NSURL) ->NSString{
        let file = fileBaseUrl.URLByAppendingPathComponent(name)
       //  print(file)
        let readHandler = try! NSFileHandle(forReadingFromURL:file)
        let data = readHandler.readDataToEndOfFile()
        let readString = NSString(data: data, encoding: NSUTF8StringEncoding)
        return readString!
    }

实现 如下:

// MARK:-  存储plist属性列表
    private func savePlistFiles(){
        // 储存的沙盒路径
        let manager = NSFileManager.defaultManager()
        let urlForCatch = manager.URLsForDirectory(NSSearchPathDirectory.CachesDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
        let url = urlForCatch.first! as NSURL
        let fileName = "RookieSon.plist"
        // 创建文件
        let filesPath = Tool.creatNewFiles(fileName, fileBaseUrl: url)
        // 储存数据
        let saveDataInfo = NSMutableArray()
        saveDataInfo.addObject("我的剑,就是你的剑")
        saveDataInfo.addObject("我用双手成就你的梦想")
        saveDataInfo.addObject("纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路")
        //        print(saveDataInfo)
        // 写入文件
        saveDataInfo.writeToURL(NSURL(string: filesPath)!, atomically: true)
        
        // 读取文件
        let readDataInfo = Tool.readTheFlies(fileName, fileBaseUrl: url)
        print(readDataInfo)
    }

/* 打印结果: 
**<plist version="1.0">**
**<array>**
** <string>****我的剑****,****就是你的剑****</string>**
** <string>****我用双手成就你的梦想****</string>**
** <string>****纵然前路迷茫,纵然天隔一方,纵然我手中的刀刃已然破碎,也无法阻挡我寻找你的道路****</string>**
**</array>**
**</plist>**
*/

3.NSKeyedArchiver采用归档的形式来保存数据
NSKeyedArchiver保存数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法,简单的说就是告诉系统怎么对对象进行编码,怎么对对象进行解码. 下面就对Person这个对象进行归档保存:
Person.m文件:

class Person: NSObject {
    
    var name:String?
    var phone:String?
    
    // 构造方法
    init(name:String!,phone:String!) {
        self.name = name
        self.phone = phone
        
        super.init()
    }
    
    // 从NSObject解析回来
    
    init(coder aDecoder:NSCoder!){
        self.name=aDecoder.decodeObjectForKey("name") as? String
        self.phone=aDecoder.decodeObjectForKey("phone") as? String
    }
    
    //编码成object,哪些属性需要归档,怎么归档
    func encodeWithCoder(aCoder:NSCoder!){
        aCoder.encodeObject(name,forKey:"name")
        aCoder.encodeObject(phone,forKey:"phone")
    }
    
}

实现部分代码如下:

 private func  archiveSaveDataInfo(){
    // 储存自定义对象
    let userDefault = NSUserDefaults.standardUserDefaults()
    let mo = Person(name: "RookieYX", phone: "123456")
    // 实例对象转化成NSData
    let moData:NSData = NSKeyedArchiver.archivedDataWithRootObject(mo)
    // 储存NSData对象
    userDefault.setObject(moData, forKey: "myMo")
    // 自定义对象读取
    let myMoData = userDefault.objectForKey("myMo") as! NSData
    // 解档
    let myM= NSKeyedUnarchiver.unarchiveObjectWithData(myMoData) as! Person
    print(myM)

    }

/*
打印结果:
**<SwiftUserDefault.Person: 0x7fd958518450>**
**person ****名字****: Optional("Rookie")**
**person ****电话****: Optional("123456")**
*/

看了以上写的东西,我相信你已经对这三种简单的存储有了初步理解,那么我们就来检查一下自己的学习的知识吧,我们现在做一个简单的网络图片的本地缓存处理. 你可以先想一下,在继续看下去吧(⊙o⊙)…!(具体我直接贴代码)
函数实现部分:

    /**
     传递一个uiimageView,和图片路径,设置图片,异步操作
     
     - parameter newsImageView: UIImageView
     - parameter imageString:   网络图片地址
     */
   class func setImagesViewData(newsImageView:UIImageView,imageString:String){
        // 获取文件路径
        var catePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory,NSSearchPathDomainMask.AllDomainsMask, true)
        print(catePath)
        let cateImagesUrl:NSURL = NSURL(fileURLWithPath: "\\(catePath.first)/\\(imageString.Rookie_MD5())")//获取缓存加密后的路径
        
        //缓存存在直接加载
        if let cateReadData:NSData  = NSData(contentsOfURL: cateImagesUrl){
            newsImageView.image = UIImage(data: cateReadData);
        }
        else{
            newsImageView.image = UIImage(named: "load.jpg");//默认图片
            //这里我们做个异步处理,用来加载图片
            let session = NSURLSession.sharedSession();
            let task = session.dataTaskWithURL(NSURL(string: imageString)!, completionHandler: { (imageData:NSData?, resp:NSURLResponse?, error:NSError?) in
                if let error = error {
                    print("连接网络失败1:\\(error)");
                }else{
                    // 当我们加载完数据了回主线程修改图片
                    if let endImageData = imageData{
                        dispatch_sync(dispatch_get_main_queue(), {
                            newsImageView.image = UIImage(data: endImageData)
                        })
                        // 写入本地
                        endImageData.writeToURL(cateImagesUrl, atomically: true)
                    }
                }
            })
            
            // 启动任务
            task.resume()
        }
    }
    

实现部分代码:

 private func cacheIntenetImage(){
        Tool.setImagesViewData(ImgView, imageString: URL)
    }

希望通过这篇文章可以对你有所帮助,因为我们在Swift学习之路上,如有错误之处,还请各位大 指出! ! 之后将会学习其他的数据存储方式,总结好之后也会更新在博客上, 有要学习的同学,可以关注一下me,可以通过这里互相学习一下,共同进步 ...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容