单身

时间:2016-06-07 15:42:17

标签: ios swift design-patterns singleton

我有我的文件myAPI.swift,以及两个对象RoundGameStats。我的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()

    }

所以我有两个问题,

  1. 我无法在myApp.sharedInstance.currentRound.id = 5内调用init()(例如)我的单身,这是正常的(我猜它是但我找不到任何东西)关于那个)

  2. 为什么在init()方法中我的第一个NSLog self.currentRound?.gameStats在函数loadData()中为零时为零?因为我们离开了这个功能,所以它似乎失去了它的参考。

  3. 我现在正在做的是在我的单身人士中添加currentStats属性,然后当我检索数据而不是self.currentRound.gameStats = stats时,我执行self.currentStats = stats,然后self.currentRoud.gameStats = self.currentStats和如果我这样做有效,我真的不知道如果我在这里做的事情。

    我的两个对象RoundGameStats符合NSCoding协议,因为我为它们实施了@objc func encodeWithCoder@objc required init?(coder aDecoder: NSCoder)方法。

    感谢您的帮助。

0 个答案:

没有答案