2016-01-19 2 views
0

Я пытался получить постоянные данные в своем приложении, чтобы иметь историю пользовательских записей. После того, как я храню свои данные в массиве, я хочу его заархивировать, и после того, как я его распакую, я получаю странное значение вместо того, что хочу видеть.Использование NSCore и NSKeyedArchiver с SWIFT

Вот мой класс для того, где я хранить мои данные

Foundation Импорт

class MyHistory: NSObject, NSCoding { 
    var kicksNumber: Int 
    var durationNumber: Int 


    init(kicksNumber: Int,durationNumber: Int) { 
     self.kicksNumber = kicksNumber 
     self.durationNumber = durationNumber 
    } 

    required init(coder decoder: NSCoder) { 
     kicksNumber = decoder.decodeObjectForKey("kicksNumber") as! Int 
     durationNumber = decoder.decodeObjectForKey("durationNumber") as! Int 
    } 


    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(self.kicksNumber, forKey: "kicksNumber") 
     coder.encodeObject(self.durationNumber, forKey: "durationNumber") 
    } 
} 

Тогда вот мой класс, где все происходит, и где я тестируя сохранение и процесс загрузки.

class Kicks: UIViewController { 

    var myHistoryArray: [MyHistory] = [] 
    var currentMyHistory: MyHistory! 
    var newHistory = [MyHistory]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     self.view.backgroundColor = UIColor(patternImage: UIImage(named: "background13.png")!) 


     let defaults = NSUserDefaults.standardUserDefaults() 

     if let savedPeople = defaults.objectForKey("MyHistory") as? NSData { 
      newHistory = NSKeyedUnarchiver.unarchiveObjectWithData(savedPeople) as! [MyHistory] 
      //print("this is archived ", newHistory[0]) 

     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    var count = 0 as Int 
    var countKicks = 0 as Int 
    var kickReached = false as Bool 
    var pressedOnce = true as Bool 
    var timer = NSTimer() 
    var test: MyHistory! 

    @IBOutlet var timerLabel: UITextField! 
    @IBOutlet var kicksLabel: UITextField! 


    @IBAction func kickButton() { 
     //currentMyHistory.kicksNumber = 5 


     if pressedOnce { 
      pressedOnce = false 
      timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("counter"), userInfo: nil, repeats: true) 
     } else if kickReached { 

      // let date = NSDate() 
      // let calendar = NSCalendar.currentCalendar() 
      // let timer_total = calendar.components([ .Hour, .Minute, .Second], fromDate: date) 
     } else if !pressedOnce { 
      countKicks++ 
      kicksLabel.text = "\(countKicks)" 
      if countKicks == 10 { 
       kickReached = true 
       timer.invalidate() 
       congratsAlert() 

       currentMyHistory = MyHistory(kicksNumber: 5, durationNumber: 10) 
       print("this is currentMyHistory", currentMyHistory.kicksNumber) 

       myHistoryArray.append(currentMyHistory) 
       test = myHistoryArray[0] 
       print("this is myHistoryArray0", test.kicksNumber) 
       //save data 
       let savedData = NSKeyedArchiver.archivedDataWithRootObject(myHistoryArray) 
       let defaults = NSUserDefaults.standardUserDefaults() 
       defaults.setObject(savedData, forKey: "MyHistory") 
       //load data 
       //let defaults = NSUserDefaults.standardUserDefaults() 

       // let person = people[indexPath.item] 
       //let historyUnarchived = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? [MyHistory] 
     //  let data1 = NSUserDefaults.standardUserDefaults().objectForKey("myHistoryArray") 
       print("this is unrachived",newHistory[0]) 
       clear() 
      } 
     } 
    } 

    // save countKicks, count, and stamp i 
    func congratsAlert() { 
     let alert = UIAlertController(title: "Congratulation", message: "Yay!!! Angelina kicked 10 times in less than 2 hours.",preferredStyle: .Alert) 

     let okAction = UIAlertAction(title: "Ok",style: .Default,handler:{(action:UIAlertAction) -> Void in}) 
     alert.addAction(okAction) 

     presentViewController(alert,animated: true,completion: nil) 
    } 

    func clear() { 
     count = 0 
     countKicks = 0 
     kickReached = false 
     pressedOnce = true 
     timerLabel.text = "00:00:0\(count)" 
     kicksLabel.text = "\(countKicks)" 
    } 

    func counter() { 
     ++count 
     let (hour,minutes,seconds) = secondsToHoursMinutesSeconds(count) 

     if seconds < 10 && minutes < 10 { 
      timerLabel.text = "0\(hour):0\(minutes):0\(seconds)" 
     } else if seconds > 9 && minutes < 10 { 
      timerLabel.text = "0\(hour):0\(minutes):\(seconds)" 
     } else if seconds > 9 && minutes > 9 { 
      timerLabel.text = "0\(hour):\(minutes):\(seconds)" 
     } else if seconds < 10 && minutes > 9 { 
      timerLabel.text = "0\(hour):\(minutes):0\(seconds)" 
     } 
    } 

    func secondsToHoursMinutesSeconds (seconds : Int) -> (Int, Int, Int) { 
     return (seconds/3600, (seconds % 3600)/60, (seconds % 3600) % 60) 
    } 
    /* 

    func savePlaces() { 
     let placesArray = [myHistory(kicksNumber: 420, durationNumber: 89)] 
     let placesData = NSKeyedArchiver.archivedDataWithRootObject(placesArray) 
     NSUserDefaults.standardUserDefaults().setObject(placesData, forKey: "kicks") 
    } 

    func loadPlaces() { 
    let placesData = NSUserDefaults.standardUserDefaults().objectForKey("kicks") as? NSData 

    if let placesData = placesData { 
    let placesArray = NSKeyedUnarchiver.unarchiveObjectWithData(placesData) as? [myHistory] 

    if let placesArray = placesArray { 
    // do something… 
    } 

    } 
    }*/ 
} 

Мой выход, как это:

это currentMyHistory 5

это myHistoryArray0 5

это unrachived

Сообщение от отладчика: Отменено из-за сигнала 15

Почему unarchived странно стоимость?

ответ

0

В классе MyHistory вы используете Интс, поэтому в функции encodeWithCoder вы должны использовать

coder.encodeInteger(self.kicksNumber, forKey: "kicksNumber") 
coder.encodeInteger(self.durationNumber, forKey: "durationNumber") 

Аналогично для вашего декодера вы должны использовать decodeIntForKey, не decodeObjectForKey.

kicksNumber = decoder.decodeIntegerForKey("kicksNumber") 
durationNumber = decoder.decodeIntegerForKey("durationNumber") 
Смежные вопросы