如何实现unarchiver委托覆盖类名?

时间:2016-01-18 14:16:04

标签: swift delegates nskeyedarchiver nskeyedunarchiver

  • 我的IOS-App有2个目标:MYAPPTARGET_1& MYAPPTARGET_2
  • MYAPPTARGET_1使用NSKeyedArchiver将流写入BLOB
  • MYAPPTARGET_2使用NSKeyedUnarchiver从BLOB读取流

当我从MYAPPTARGET_2中的BLOB取消归档流时,我收到错误:         016-01-18 15:01:38.541 WorldHistoryAtlasTest [598:9405] *由于未捕获的异常'NSInvalidUnarchiveOperationException'而终止应用,         原因:'* - [NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象     (MYAPPTARGET_1.MapTheme)用于键(rootobject);

所以它显然用MYAPPTARGET_1的前缀编码,并且不能从MYAPPTARGET_2中读取。

所以我得到了一个提示,可以在另一个STACKOVERFLOW中克服这个问题。使用委托unarchiver来覆盖Classname。但我无法实现这一点:

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

我有一个名为MYAPPTARGET_1的应用程序,我使用NSKeyedArchiver功能将一些数据存储为blob。

然后稍后使用名为MYAPPTARGET_2的第二个Apps-Target尝试再次读取数据。从存储在DB中的BLOB加载。

如果有人能给我一个实际的暗示,我会很高兴的。

1 个答案:

答案 0 :(得分: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-app和iphone app之间交换自定义对象