2015-07-19 59 views
0

當安全解碼類型的屬性(例如,recordsNSArray你通常會做:安全地與元素符合協議(NSSecureCoding)解碼的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)}'." 

回答

0

如果您使用的Xcode 7在Objective-C的進步使這可能使用新的「輕重量的仿製藥」的特點:

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

注:這將編譯完全正常,但我有沒有經過測試,以確保它完美地讀取和寫入磁盤。這將是一個很好的開始。

+0

是的......但這不是向後兼容的,對吧? –

+0

我不知道,但我不明白爲什麼,因爲編譯器的版本不應該對它可以定位的iOS版本有任何影響。我有使用在iOS7模擬器上運行的輕量級泛型的代碼 – DBoyer

+0

@DBoyer有兩種可能性:1.如果它只是編譯時功能,那麼如果您更改數據流中的類,它將不起作用,因爲這必須在運行時檢查。無意義的。 2.如果它在運行時運行,則運行時版本可能會有影響。 (我想它是1,但我沒有測試它。) –

0

沒有直截了當的方式。 Class是指向類的指針,而不是指向協議。即使協議類似於RTE內的類,如果找到的類實現協議,-isKindOfClass:也不會返回YES

你可以做兩件事情:

  1. 撰寫方法-decodeArrayOfItemsConformingToProtocol:forKey:。使用現有的解碼方法作爲模板。我從來沒有這樣做過,但我認爲這不僅僅是一個小時的工作。

  2. 使用RTE找出哪些類符合協議,並將其作爲允許的類的列表。