我有我的文件myAPI.swift
,以及两个对象Round
和GameStats
。我的Round
对象也有一个属性GameStats
。所以我想要做的是获取我存储在用户默认值中的GameStats
属性,然后将其分配到我的Round
对象中。
class myAPI: NSObject {
static let sharedInstance = myAPI()
var currentStats: GameStats?
var currentRound: Round?
private init(){
super.init()
self.loadData()
NSLog("Stats have been reload: \(self.currentRound?.gameStats)") // Return nil
// If I try to add this line the app stop running and nothing happens
NSLog("Test Singleton: \(myApp.sharedInstance.currentRound?.gameStats)")
}
func loadData(){
let backupNSData = NSUserDefaults.standardUserDefaults().objectForKey("backupNSData")
if let backupNSData = backupNSData as? NSData{
let backupData = NSKeyedUnarchiver.unarchiveObjectWithData(backupNSData)
if let backupData = backupData as? [String:AnyObject] {
guard let round = backupData["currentRound"] as? Round else {
print("error round loaddata")
return
}
self.currentRound = round
guard let stats = backupData["stats"] as? GameStats else {
print("error guard stats")
return
}
self.currentRound.gameStats = stats
NSLog("Stats reloaded: \(stats)") // This is not nil it works here
}
}
}
当我的应用程序崩溃时,我调用此函数来保存数据
func backupData(){
var backupData:[String:AnyObject] = [String:AnyObject]()
if let round = self.currentRound {
backupData["currentRound"] = round
ColorLog.purple("Stats saved inside Round \(round.gameStats)")
}
if let stats = self.currentStat {
backupData["stats"] = stats
ColorLog.purple("Stats saved : \(stats)")
}
let backupNSData = NSKeyedArchiver.archivedDataWithRootObject(backupData)
NSUserDefaults.standardUserDefaults().setObject(backupNSData, forKey: "backupNSData")
NSUserDefaults.standardUserDefaults().synchronize()
}
所以我有两个问题,
我无法在myApp.sharedInstance.currentRound.id = 5
内调用init()
(例如)我的单身,这是正常的(我猜它是但我找不到任何东西)关于那个)
为什么在init()
方法中我的第一个NSLog
self.currentRound?.gameStats
在函数loadData()
中为零时为零?因为我们离开了这个功能,所以它似乎失去了它的参考。
我现在正在做的是在我的单身人士中添加currentStats
属性,然后当我检索数据而不是self.currentRound.gameStats = stats
时,我执行self.currentStats = stats
,然后self.currentRoud.gameStats = self.currentStats
和如果我这样做有效,我真的不知道如果我在这里做的事情。
我的两个对象Round
和GameStats
符合NSCoding
协议,因为我为它们实施了@objc func encodeWithCoder
和@objc required init?(coder aDecoder: NSCoder)
方法。
感谢您的帮助。