繁体   English   中英

使用NSUserDefaults Swift存储数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM