[英]Storing Data with NSUserDefaults Swift
想知道如何使用NSUserDefaults
这是否是保存我在应用程序中拥有的数据的正确解决方案。 数据不是很多,所以我虽然这可能是一个很好的解决方案。 当前将数据存储到应用程序中的对象中,然后在用户设置对象后将对象加载到数组中。
var placesChosen: [Place] = []
var myplaces: Place = Place()
class Place {
var name: String?
var locationAddress: String?
var locationPhoneNumber: String?
}
function createPlace(){
// code to add place
placeChosen.append("some data to add")
}
稍后,我想从NSUserDefaults
存储的数据中提取数据并将数据显示给用户。 另外,尽管我应该提到用户只能将对象设置为数组。
不建议在NSUserDefaults
存储大量数据。 NSUserDefaults用于存储诸如用户首选项之类的小数据。
如果仍然要继续,则可以使用在Playground中编译的以下代码。
//: Playground - noun: a place where people can play
import UIKit
// Update your class to add encoder and decoder
class Place: NSObject, NSCoding {
var name: String?
var locationAddress: String?
var locationPhoneNumber: String?
init(name:String, locationAddress: String,locationPhoneNumber: String) {
self.name = name
self.locationAddress = locationAddress
self.locationPhoneNumber = locationPhoneNumber
}
required convenience init(coder aDecoder: NSCoder) {
let name = aDecoder.decodeObjectForKey("name") as! String
let locationPhoneNumber = aDecoder.decodeObjectForKey("locationphonenumber") as! String
let locationAddress = aDecoder.decodeObjectForKey("locationaddress") as! String
self.init(name: name, locationAddress: locationAddress, locationPhoneNumber: locationPhoneNumber)
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey: "name")
aCoder.encodeObject(locationAddress, forKey: "locationaddress")
aCoder.encodeObject(locationPhoneNumber, forKey: "locationphonenumber")
}
}
//Create your array of chosen place
let placesChosen = [Place(name: "India",locationAddress: "IndianAddress",locationPhoneNumber:"IndianPhoneNumber"), Place(name: "India",locationAddress: "IndianAddress",locationPhoneNumber:"IndianPhoneNumber")]
// Add your data to NSUser defaults
var userDefaults = NSUserDefaults.standardUserDefaults()
let encodedData = NSKeyedArchiver.archivedDataWithRootObject(placesChosen)
userDefaults.setObject(encodedData, forKey: "place")
userDefaults.synchronize()
// Retrieve your data from NSUserDefaults
if let decodedData = NSUserDefaults.standardUserDefaults().objectForKey("place") as? NSData {
let decodedPlace = NSKeyedUnarchiver.unarchiveObjectWithData(decodedData) as! [Place]
print(decodedPlace)
}
在本地存储数据时可以考虑许多解决方案(换句话说,可能是数据缓存)。
首先,您应该考虑数据的生命周期。 如果将生命周期与应用程序一起设置,则应仅使用存储的数据作为全局变量。
如果希望将数据保留更长的时间,则可以使用其中的一种,包括NSUserDefaults,CoreData和“将文件保存到磁盘”。
NSUserdefaults非常简单,并且是一种快速使用方法。 我认为这是为了保存诸如用户设置之类的轻量级数据。
CoreData是一个功能强大的工具,但是在您要存储大型,复杂和关系数据的情况下。 从您的问题来看,我认为这不是一件好事。
将plist或任何格式的文件存储在本地磁盘中对您来说是一个不错的选择。 这适用于少量和大量数据。
简而言之,如果您不希望永久保存对象,建议您将对象作为全局变量传递。 否则,请使用NSUserdefaults或本地磁盘。 请记住,对于自定义对象,我们需要实现用于数据序列化/反序列化的NSCoding协议,以及用于数据编码/解码的NSKeyedArchiver和NSKeyedUnarchiver。
我希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.