使用NSUserDefaults Swift存储数据

时间:2016-07-14 04:09:34

标签: ios swift nsuserdefaults

想知道如何使用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存储的数据中提取数据并将数据显示给用户。另外,我应该提到用户只能将对象设置到数组中。

2 个答案:

答案 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。

我希望这会有所帮助。