0

我有一个需要采用NSSecureCoding跨 XPC 连接进行传输的 Objective-C 类。该类有几个不透明类型的属性(dispatch_queue_tdispatch_group_t)。

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

4

1 回答 1

1

没有适用于所有不透明类型的通用解决方案,但您提到了dispatch_queue_tand dispatch_group_t。如果调度队列和组对编码对象是私有的,那么-initWithCoder:就像 Kurt Revis 所说的那样重新创建它们。如果它们是共享的,那就有点麻烦了,但是您有时可以通过归档“代理”对象来解决它,然后在解码后遍历对象图,将所有对代理的引用替换为对单个的引用,新创建的“真实”对象。

确实,这听起来像是一种反模式。实现 NSCoding/NSSecureCoding 的类通常是模型类,在模型类的 ivars 中存在调度队列和组是一种危险信号。我可以想到在模型类 ivar 中拥有私有队列(即序列化多线程访问内部状态)而不是共享队列的一些正当理由。一般来说,听起来可能需要进行一些重构。

于 2013-08-21T11:47:42.753 回答