2016-03-30 7 views
3

Я только что выпустил приложение в хранилище приложений, и один из моих покровителей дал мне знать, что я должен изменить тип данных, который я ранее хранил в качестве Integer, используя NSKeyedArchiver, Дважды.Как преобразовать объекты NSKeyedArchiver в новые версии

Простота изменения модели данных приложения, но когда я перезагружаю приложение на своем тестовом устройстве, NSKeyedUnarchiver явно не хочет декодировать Integer как Double и выдает исключение NSInvalidUnarchiveOperation.

Мне было интересно, как любой другой iOS Dev's справится с этой ситуацией. Мне бы очень хотелось стереть все ранее сохраненные данные моих пользователей, но это единственное решение, которое я вижу.

Мой код опубликован ниже. Я закомментирована несколько решений я пытался без толка

required convenience init?(coder aDecoder: NSCoder){ 

     func decodeDoubles(coder aDecoder: NSCoder) throws-> (Double, Double){ 
      print("Getting in here") 
      /* These are stored as Integers in previous version */ 
      let myEarned = aDecoder.decodeDoubleForKey(PropertyKey.earnedKey) 
      let myTotal = aDecoder.decodeDoubleForKey(PropertyKey.totalKey) 

      /* App Crashes here - exception not caught */ 
      print("After decode attempt") 
      return (myEarned, myTotal) 
     } 

     let myID = aDecoder.decodeIntegerForKey(PropertyKey.idKey) 
     let myName = aDecoder.decodeObjectForKey(PropertyKey.nameKey) as! String 
     let myWeight = aDecoder.decodeIntegerForKey(PropertyKey.weightKey) 
      /* Throws exception */ 
      //let myEarned = aDecoder.decodeDoubleForKey(PropertyKey.earnedKey) 
      //let myTotal = try! aDecoder.decodeDoubleForKey(PropertyKey.totalKey) 


     var myEarned: Double = 0 
     var myTotal: Double = 0 

     do { 
      (myEarned, myTotal) = try decodeDoubles(coder: aDecoder) 
     } catch { 
      print("Exception caught - \(error)") 
      myEarned = Double(aDecoder.decodeIntegerForKey(PropertyKey.earnedKey)) 
      myTotal = Double(aDecoder.decodeIntegerForKey(PropertyKey.totalKey)) 
    } 

     self.init(id: myID, name: myName, weight: myWeight, earned: myEarned, total: myTotal) 
    } 

ответ

3

Вам может понадобиться, чтобы сделать функцию своего рода обновить архив, как приложение нагрузка, прочитанную в ключе как Integer, и записать его назад как двойной, тогда остальное приложение может читать и записывать его как двойное нормально. вам понадобится новый ключ, чтобы отметить, что вы сделали обновление, поэтому не делайте этого снова и не делайте этого для новых пользователей.

+0

Вот как бы я это сделал. –

+0

Это отличная идея! Я подумал об этом, но не был точно уверен, где я могу хранить флаг, чтобы избежать такой же проблемы при попытке декодирования целого числа как двойного. Я думаю, что могу попытаться сохранить значение NSUserDefaults или добавить значение флага в NSKeyedArchiver. Какие-либо предложения? – Louie4

+0

Сохранение флага в NSUserDefaults, вероятно, проще. также просто попробуйте/поймать функцию, чтобы, если она не читала целое число, она будет считать ее новым пользователем и отметит флаг, чтобы он не попытался сделать это снова (или значение как-то не присутствует и не нуждается в быть обновлен в любом случае) – Fonix