2013-01-06 69 views
3

我試圖用類NSKeyedArchiver保存一個SKProduct對象,但它產生一個錯誤,如下所示:- [SKProduct encodeWithCoder:]:無法識別的選擇器發送到實例如何在本地保存SKProduct對象?

+ (void)saveProduct:(SKProduct *)product 
{ 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:product]; 
    [[NSUserDefaults standardUserDefaults] setValue:data forKey:PRODUCT]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

有沒有辦法保存SKProduct的實例?

+0

不知道你在這裏試圖做什麼。你爲什麼想做這個?我寧願在我需要時從App Store重新加載產品,以確保產品仍然提供並檢查其價格。此外,您不知道商店套件和「SKProduct」如何與App Store進行溝通,以及「SKProduct」如何與其他商店套件進行連線。 –

+0

每次請求數據以檢索所有產品是非常耗時的,而且對於內省,一次足以確保價格。 –

+3

好吧,即使您知道價格,您也很可能無法使用SKPaymentQueue,因爲它不會與其他商店套件「連線」。另請參閱@endy對此的評論。如果您真的急於節省時間,您可以將其加載到後臺某處,但至少每次啓動一次。 –

回答

3

您的SKProduct類需要符合NSCoding協議。

換句話說,您需要在SKProduct類中填寫這兩個方法。

  • (void)encodeWithCoder:(NSCoder *)aCoder;
  • (id)initWithCoder:(NSCoder *)aDecoder;

這將把你的SKProduct類和分解,以便它可以序列化和反序列化。

+0

所以我需要創建一個類別來添加這兩種方法。有沒有另一種方法來保存它,而不是這個? –

+4

我沒有意識到SKProduct是Apple類。事實上,SKProduct類可能有很多私有屬性,並且序列化它們可能會使用私有API。不包括私有屬性不會產生你想要的結果。我會建議重新考慮爲什麼你需要序列化這些對象並尋找替代方案。 – endy