采用不透明类型的NSSecureCoding

时间:2013-08-20 00:18:20

标签: objective-c grand-central-dispatch nscoding xpc nssecurecoding

我有一个Objective-C类,需要通过NSSecureCoding来跨XPC连接进行传输。该类有一些不透明类型的属性(dispatch_queue_tdispatch_group_t)。

在这种情况下,如何实施-initWithCoder:-encodeWithCoder:?文档说这些是类似对象的结构,所以我假设它们需要在编码/解码时转换为/从原始字节转换?如果是这种情况,我不确定应该使用哪种方法来执行此操作。另一种选择是简单地避免对它们进行编码,并在-initWithCoder:内重新创建它们。

1 个答案:

答案 0 :(得分:1)

所有 opaque类型都没有通用解决方案,但您提到了dispatch_queue_tdispatch_group_t。如果调度队列和组对编码对象是私有的,那么只需在-initWithCoder:中重新创建它们就像Kurt Revis所说的那样。如果它们是共享的,它会有点毛茸茸,但你有时可以通过归档“代理”对象来解决它,然后在解码它之后遍历你的对象图,用对单个的引用替换对代理的所有引用,新创造的“真实”对象。

但实际上,这听起来像一个反模式。实现NSCoding / NSSecureCoding的类通常是模型类,它是一种红色标志,在模型类的ivars中有调度队列和组。我可以想到一些合法的理由在模型类ivar中拥有一个私有队列(即序列化对内部状态的多线程访问),但不是共享的。一般来说,听起来有些重新分解可能是有序的。