3

アプリ ストアにアプリをリリースしたばかりで、常連客の 1 人から、以前は NSKeyedArchiver を使用して整数として保存していたデータ型を Double に変更する必要があるとの連絡がありました。

アプリのデータ モデルを変更するのは簡単ですが、テスト デバイスでアプリをリロードすると、NSKeyedUnarchiver は明らかに Integer を Double としてデコードしたくなく、NSInvalidUnarchiveOperation 例外をスローします。

他の iOS 開発者がこの状況をどのように処理するのか疑問に思っていました。ユーザーの以前に保存したデータをすべて消去したくはありませんが、それが唯一の解決策です。

私のコードは以下に掲載されています。役に立たなかったいくつかの解決策をコメントアウトしました

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

1 に答える 1

4

アプリがロードされ、キーを整数として読み取り、double として書き戻すと、アーカイブを一種のアップグレードする関数を作成する必要がある場合があります。その後、アプリの残りの部分は通常 double として読み書きできます。 . アップグレードを行ったことを示すために新しいキーが必要になるため、再度アップグレードを行ったり、新しいユーザーに対してアップグレードを行ったりしないでください。

于 2016-03-30T03:19:47.947 に答える