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)
}
Ben böyle yapardım. –
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
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