swift本地存储
来源:互联网 发布:网络犯罪的客观原因有 编辑:程序博客网 时间:2024/06/05 04:31
前言:在我们开发过程中,不管是你做啥子应用,都要遇到数据的保存问题。将数据保存本地,这样让程序的运行更加流畅,不在出现小菊❀这样的╮(╯﹏╰)╭东东了,使得用户体验更好! 以下将介绍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,可以通过这里互相学习一下,共同进步 ..
作者:叫我干苦力的小码农
链接:http://www.jianshu.com/p/efd358d53ffd
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- swift本地存储
- Swift简单的本地存储方式NSUserDefaults
- Swift-如何存储数据在本地
- swift中NSUserDefaults的用法(轻量级本地数据存储)
- Swift - 使用NSUserDefaults来进行本地数据存储
- Swift - 使用NSUserDefaults来进行本地数据存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- 本地存储
- OpenCV2编程手册笔记之 5.5分水岭算法对图像进行分割
- Android studio微信支付官网demo
- 如何关闭电脑的自启软件?
- C#基础-040 设计User类,该类有用户名,密码,存款金额。该类用户有存款,取款的方法;设计 CreditUser,该类新增信用额度。用户每次提升信用额度后,每刷卡刷爆三次,信用额度提升1000
- 存储管理
- swift本地存储
- selectionSort
- 演讲、演讲人、听众
- ubuntu修改静态IP地址
- String.Format()
- LRU算法 C++实现
- DNS
- cocos2d中去掉微信呢称中的表情字符(ios与android)
- 颓废了?看看这些!