在努力为NativeScript插件添加跨平台支持时,该插件的某些区域将需要保留Object状态。这意味着在给定的时间,需要保留数据状态并将其存储在NativeScript(TypesScript / JavaScript)中,并在不破坏数据的情况下将其恢复。
尽管在许多用于插件的Android方面的JAVA
库中,这似乎很简单,但是我不确定如何为iOS开发复制该函数。
在努力为NativeScript插件添加跨平台支持时,该插件的某些区域将需要保留Object状态。这意味着在给定的时间,需要保留数据状态并将其存储在NativeScript(TypesScript / JavaScript)中,并在不破坏数据的情况下将其恢复。
尽管在许多用于插件的Android方面的JAVA
库中,这似乎很简单,但是我不确定如何为iOS开发复制该函数。
在线研究此主题可能会导致各种答案,其中大多数似乎要求开发人员在给定的Object / Class上创建特定方法以支持序列化。
NSCoding
协议Source (Apple)声明了一个类必须实现的两个方法,以便可以对该类的实例进行编码和解码。此功能为归档(将对象和其他结构存储在磁盘上)和分发(将对象复制到不同的地址空间)提供了基础。
提到的两种方法是:
- (void) encodeWithCoder:(NSCoder*)encoder;
- (id) initWithCoder:(NSCoder*)decoder;
尽管这在大多数情况下可行,但这将需要NativeScript开发人员找出一种方法来为iOS库(可能是pod包)创建另一个包装。这比实际需要的更多,而且在大多数情况下可能无法使用。
NSKeyedArchiver
和随附的NSKeyedUnarchiver
协议提供了一种将对象(和标量值)编码/解码为独立于体系结构的方式,适合存储在文件中。
此选项似乎不那么麻烦,并且允许将已归档的对象转换为在base64
等环境之间共享的东西:
declare var NSDataBase64EncodingEndLineWithLineFeed;
declare var NSDataBase64DecodingIgnoreUnknownCharacters;
// archive class instance as base64 string
const archivedObject = NSKeyedArchiver.archivedDataWithRootObject(someClassInstance);
const base64Archive = archivedObject.base64EncodedStringWithOptions(NSDataBase64EncodingEndLineWithLineFeed);
// unarchive back into a class instance
const rawData = NSData.alloc().initWithBase64EncodedStringOptions(base64Archive,NSDataBase64DecodingIgnoreUnknownCharacters);
const newClassInstance = NSKeyedUnarchiver.unarchivedObjectOfClassFromDataError(NSObject,rawData);
我能够从时间流逝的旧文章中学习这两个概念(但值得庆幸的是,由于WayBackMachine而得以保存)— CocoaHeads - NSCoding
除了上述信息之外,我相信还可以使用NativeScript扩展现有的ObjC类并添加所需的encodeWithCoder
和initWithCoder
方法。虽然我不需要执行此操作或尝试进行此操作,但是如果我自己或其他人碰巧尝试了此操作并取得了不错的效果,请告诉我,我将在此处添加该示例。
有关通过扩展NativeScript中的Objective-C类创建子类的更多信息,请查看以下源: https://docs.nativescript.org/core-concepts/ios-runtime/how-to/ObjC-Subclassing
有关NativeScript中的Objective-C类的更多信息,请在此处阅读:https://docs.nativescript.org/core-concepts/ios-runtime/types/ObjC-Classes