想知道如何使用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
存储的数据中提取数据并将数据显示给用户。另外,我应该提到用户只能将对象设置到数组中。
答案 0 :(得分:1)
不建议在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)
}
答案 1 :(得分:0)
在本地存储数据时可以考虑许多解决方案(换句话说,可能是数据缓存)。
首先,您应该考虑数据的生命周期。如果生命周期与应用程序一起设置,则应该只使用存储数据存储为全局变量。
如果您希望您的数据可以保持更长时间,您可以使用NSUserDefaults,CoreData和将文件保存到磁盘等各种可能性。
NSUserdefaults非常简单,使用起来快捷。我认为它可以保存轻量级数据,例如用户的设置。
CoreData是一个功能强大的工具,但您只想存储大型,复杂和关系数据。从你的问题来看,我不认为这是一个很好的协议。
以文件形式存储在本地磁盘中,或者任何格式都是一个非常好的选择。这适用于小量和大量数据。
简单地说,如果您不希望持久保存它,我建议您将对象作为全局变量传递。否则,请使用NSUserdefaults或本地磁盘。请记住,对于自定义对象,我们需要实现用于数据序列化/反序列化的NSCoding协议以及用于数据编码/解码的NSKeyedArchiver和NSKeyedUnarchiver。
我希望这会有所帮助。