使用符合协议的元素安全地解码NSArray(NSSecureCoding)

时间:2015-07-19 15:40:38

标签: objective-c

安全地解码records类型的属性(例如NSArray)时,通常会这样做:

[decoder decodeObjectOfClasses:[NSSet setWithObjects:[NSArray class], [ClassOfElementsInArray class], nil] forKey:@"records"];

但是,如果所有基类知道records中的元素是否符合协议records,您将如何解码<RecordEntity>?有没有最好的做法?

更新

我使用轻量级泛型[NSArray<id<RecordEntity>> class]@DBoyer's suggestion进行了测试,但不幸的是,这并不起作用。解码时,NSKeyedUnarchiver抛出以下异常,表示只需要NSArray类型的对象。

-[BaseClassTest testDecode] : failed: caught "NSInvalidUnarchiveOperationException", "value for key 'NS.objects' was of unexpected class 'Record'. 
Allowed classes are '{(NSArray)}'."

2 个答案:

答案 0 :(得分:0)

没有直接转发的方式。 Class是指向类的指针,而不是指向协议的指针。即使协议类似于RTE内的类,如果找到的类实现协议,-isKindOfClass:也不会返回YES

你可以做两件事:

  1. 编写方法-decodeArrayOfItemsConformingToProtocol:forKey:。使用现有的decode-methods作为模板。我从来没有这样做,但我认为这不仅仅是一小时的工作。

  2. 使用RTE查找哪些类符合协议,并将其作为允许类的列表。

答案 1 :(得分:-1)

如果您正在使用Xcode 7,Objective-C的进步可以使用新的“轻量级通用”功能实现这一目标:

[decoder decodeObjectOfClass:[NSArray<id<RecordEntity>> class] forKey:@"records"];

注意:这将完全编译,但我没有测试,以确保它完美地读取和写入磁盘。这将是一个开始的好地方。