我有一个Objective-C类,需要通过NSSecureCoding
来跨XPC连接进行传输。该类有一些不透明类型的属性(dispatch_queue_t
和dispatch_group_t
)。
在这种情况下,如何实施-initWithCoder:
和-encodeWithCoder:
?文档说这些是类似对象的结构,所以我假设它们需要在编码/解码时转换为/从原始字节转换?如果是这种情况,我不确定应该使用哪种方法来执行此操作。另一种选择是简单地避免对它们进行编码,并在-initWithCoder:
内重新创建它们。
答案 0 :(得分:1)
所有 opaque类型都没有通用解决方案,但您提到了dispatch_queue_t
和dispatch_group_t
。如果调度队列和组对编码对象是私有的,那么只需在-initWithCoder:
中重新创建它们就像Kurt Revis所说的那样。如果它们是共享的,它会有点毛茸茸,但你有时可以通过归档“代理”对象来解决它,然后在解码它之后遍历你的对象图,用对单个的引用替换对代理的所有引用,新创造的“真实”对象。
但实际上,这听起来像一个反模式。实现NSCoding / NSSecureCoding的类通常是模型类,它是一种红色标志,在模型类的ivars中有调度队列和组。我可以想到一些合法的理由在模型类ivar中拥有一个私有队列(即序列化对内部状态的多线程访问),但不是共享的。一般来说,听起来有些重新分解可能是有序的。