2016-03-30 14 views
3

Uygulama mağazasına bir uygulama yayınladım ve kullanıcılarımdan biri, daha önce NSKeyedArchiver kullanarak bir Tamsayı olarak sakladığım veri türünü değiştirmem gerektiğini Çift.NSKeyedArchiver nesnelerini yeni sürümlere dönüştürmek için

Uygulamanın veri modelini değiştirmeye yetecek kadar kolay, ancak uygulamayı test cihazımda yeniden yüklediğimde, NSKeyedUnarchiver bir Tamsayı'yı Double olarak çözmek istemiyor ve bir NSInvalidUnarchiveOperation Exception atar.

Başka bir iOS Dev'in bu durumu nasıl ele alacağını merak ediyordum. Kullanıcılarımın önceden kaydedilmiş tüm verilerini silmekten nefret ediyorum, ancak gördüğüm tek çözüm bu.

Kodum aşağıda yer almaktadır. Ben boşuna çalıştı birkaç çözümler dışarı yorumladı ettik

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) 
    } 

cevap

3

Sen tür bir tamsayı anahtarında okunan uygulama yüklenirken gibi, arşiv yükseltmek için bir işlev yapmak gerekir ve bunu yazabiliriz Bir çift olarak geri, daha sonra uygulamanızın geri kalanı normalde çift olarak okuyabilir ve yazabilirsiniz. Yükseltmeyi yaptığınız bayrağa geçmek için yeni bir anahtara ihtiyacınız olacak, böylece tekrar yapmadığınızdan ve yeni kullanıcılar için yapmadığınızdan.

+0

Ben böyle yapardım. –

+0

Bu harika bir fikir! Bunu düşündüm ama tam sayıyı bir tamsayıyı ikili olarak çözmeye çalışırken aynı sorunu yaşamaya çalışmak için bayrağı nerede saklayacağımı tam olarak bilmiyordum. NSUserDefaults'a bir değer kaydetmeyi veya NSKeyedArchiver'e bir bayrak değeri eklemeye çalışmayı düşünüyorum. Baska öneri? Bayrağın NSUserDefaults'a kaydedilmesi – Louie4

+0

muhtemelen daha kolaydır. Ayrıca sadece bir tamsayıda okuyamazsa, tamsayıda okuyamazsa, onun yeni bir kullanıcı olduğunu varsayar ve bayrağı tekrar işaretlemeyecek şekilde işaretler (veya değer bir şekilde mevcut değildir ve gerek yoktur) Yine de yükseltilmelidir. – Fonix

İlgili konular