0
  • IOS-App の 2 つのターゲットがあります: MYAPPTARGET_1 と MYAPPTARGET_2
  • MYAPPTARGET_1 は NSKeyedArchiver を使用して Stream を BLOB に書き込んでいます
  • MYAPPTARGET_2 は NSKeyedUnarchiver を使用して BLOB からストリームを読み取ります

MYAPPTARGET_2 で BLOB からストリームをアンアーカイブすると、次のエラーが発生します: 016-01-18 15:01:38.541 WorldHistoryAtlasTest[598:9405] * 例外がキャッチされていないためアプリを終了しています 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: キー (rootobject) のクラス (MYAPPTARGET_1.MapTheme) のオブジェクトをデコードできません。

したがって、MYAPPTARGET_1 のプレフィックスで明らかにエンコードされているようで、MYAPPTARGET_2 からは読み取ることができません。

そのため、別の STACKOVERFLOW Answer でこれを克服するためのヒントを得て、デリゲート アンアーカイバーを使用してクラス名を上書きしました。しかし、私はこれを実装することができません:

func unarchiver(unarchiver: NSKeyedUnarchiver, cannotDecodeObjectOfClassName name: String, originalClasses classNames: [String]) -> AnyClass? {
    print("ClassName is " + name);
    return nil; // WHAT TO DO , TO OVERWRITE THE CLASS NAME.
}

 var mykeyedunarchiver:NSKeyedUnarchiver=NSKeyedUnarchiver(forReadingWithData: data!);
 mykeyedunarchiver.delegate = self;
 let temp=mykeyedunarchiver.decodeObjectForKey("rootobject")

targetname MYAPPTARGET_1 のアプリがあり、NSKeyedArchiver 機能を使用して一部のデータを blob として保存します。

その後、MYAPPTARGET_2 という名前の 2 番目の Apps-Target を使用して、データを再度読み取ろうとします。DBに格納されたBLOBから読み込みます。

誰かがこれについて実用的なヒントをくれたらとてもうれしいです。

4

1 に答える 1

0

以下で十分です。

class MyObject: NSObject, NSCoding {...}
let my = MyObject()

// archive
NSKeyedArchiver.setClassName("MyObject", for: MyObject.self)
let data = NSKeyedArchiver.archivedData(withRootObject: r)

// unarchive
NSKeyedUnarchiver.setClass(MyObject.self, forClassName: "MyObject")
let _ = NSKeyedUnarchiver.unarchiveObject(with: data)

これは、Mac アプリと iPhone アプリの間でカスタム オブジェクトを交換するのに役立ちました。

于 2016-10-12T18:24:04.747 に答える