【问题标题】:How to save whole Object in NSUserDefaults [duplicate]如何在 NSUserDefaults 中保存整个对象 [重复]
【发布时间】:2016-09-26 07:21:32
【问题描述】:

我正在使用 ObjectMapper 从我的服务器映射 JSON 响应。这是我的数据模型。

class HomeStats: Mappable {

// MARK: - Constants & Variables

var todayText: String
var pointsText: String
var todayActivitiesText: String
var totalPointsText: String
var rewardsText: String
var myStatsText: String
var motivationalMessage: String

var todaySteps: String
var todayStepPoints: String
var stepsText : String
var todayTotalPoints: Double
var allPoints: String

var userRegistrationDate: String
var firstTrackerConnectionDate: String

var userID:Int
.
.
.

等等。我在课堂上使用它作为

// init
let allStats = Mapper<HomeStats>().map([:])!

// usage
if let data = Mapper<HomeStats>().map(result){ // result is my JSON responce
      self.allStats = data;
}

现在如何将我的整个对象 allStats 在这种情况下存储到 NSUserDefaults 并稍后检索它?

【问题讨论】:

  • 我已经看到了这些答案,但它们对我来说似乎不是优化的方法,因为我必须用单独的密钥保存每件事。我想将整个对象保存在一个键上,然后将其取回。
  • NSUserDefaults 只能存储 – NSArray – NSData – NSDictionary – NSNumber – NSString 此外,NSArray 或 NSDictionary 必须只包含上面列出的类型。因此,您需要将结构转换为 NSDictionary 或保存 JSON 响应

标签: ios swift nsuserdefaults nscoding objectmapper


【解决方案1】:

如果你想将你的对象保存为单个对象,你的方式应该是符合NSCoding

class HomeStats: NSObject, Mappable, NSCoding {

    // add to your class HomeStats

    required init?(coder aDecoder: NSCoder) {
        todayText = aDecoder.decodeObjectForKey(todayText) as! String
        pointsText = aDecoder.decodeObjectForKey(pointsText) as! String
        todayActivitiesText = aDecoder.decodeObjectForKey(todayActivitiesText) as! String
        totalPointsText = aDecoder.decodeObjectForKey(totalPointsText) as! String
        rewardsText = aDecoder.decodeObjectForKey(rewardsText) as! String
        myStatsText = aDecoder.decodeObjectForKey(myStatsText) as! String
        motivationalMessage = aDecoder.decodeObjectForKey(motivationalMessage) as! String

        todaySteps = aDecoder.decodeObjectForKey(todaySteps) as! String
        todayStepPoints = aDecoder.decodeObjectForKey(todayStepPoints) as! String
        stepsText = aDecoder.decodeObjectForKey(stepsText) as! String
        todayTotalPoints = aDecoder.decodeDoubleForKey(todayTotalPoints) as! Double
        allPoints = aDecoder.decodeObjectForKey(allPoints) as! String

        userRegistrationDate = aDecoder.decodeObjectForKey(userRegistrationDate) as! String
        firstTrackerConnectionDate = aDecoder.decodeObjectForKey(firstTrackerConnectionDate) as! String

        userID = aDecoder.decodeIntForKey(userID, forKey: "userID") as! Int
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(todayText, forKey: "todayText")
        aCoder.encodeObject(pointsText, forKey: "pointsText")
        aCoder.encodeObject(todayActivitiesText, forKey: "todayActivitiesText")
        aCoder.encodeObject(totalPointsText, forKey: "totalPointsText")
        aCoder.encodeObject(rewardsText, forKey: "rewardsText")
        aCoder.encodeObject(myStatsText, forKey: "myStatsText")
        aCoder.encodeObject(motivationalMessage, forKey: "motivationalMessage")

        aCoder.encodeObject(todaySteps, forKey: "todaySteps")
        aCoder.encodeObject(todayStepPoints, forKey: "todayStepPoints")
        aCoder.encodeObject(stepsText, forKey: "stepsText")
        aCoder.encodeDouble(todayTotalPoints, forKey: "todayTotalPoints")
        aCoder.encodeObject(allPoints, forKey: "allPoints")

        aCoder.encodeObject(userRegistrationDate, forKey: "userRegistrationDate")
        aCoder.encodeObject(firstTrackerConnectionDate, forKey: "firstTrackerConnectionDate")

        aCoder.encodeInteger(userID, forKey: "userID")
    }
}

// save and load your serialised file wherever you wish with something like this:

let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
let filePath = documentsDirectory.appendingPathComponent("filename")

// serialise and save your instance
func storeHomeStats(homeStats: HomeStats) {
    let data = NSKeyedArchiver.archivedData(withRootObject: homeStats)

    do {
        try data.write(to: filePath)
    } catch let error as NSError {
        print("Couldn't write file: \(error)")
    }
}

// deserialise your instance
func loadHomeStats() -> HomeStats? {
    return NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? HomeStats
}

【讨论】:

    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2016-01-03
    相关资源
    最近更新 更多