2015-12-17 21 views
2

我目前存儲NSUserDefaultsNSUInteger留存數據,但我需要移動到一個NSObjectNSCoding標準,將被存儲爲NSData。有沒有一種方法可以確定我是否在我的密鑰中存儲了一個int或一個對象,以便我可以容納有或沒有從一種持久性類型遷移到另一種持久性類型的用戶?我知道objectForKey返回一個ID,所以這是否足夠好?如何確定什麼樣的數據存儲在NSUserDefaults的

- (id) returnStuff { 
NSData *data = [myUserDefaults objectForKey:myKey]; 
if([data isKindOfClass:[NSData class]) { 
    // then it must be an archived object 
    return (desiredObjectClass*)[NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 
else { 
    NSUInteger returnInt = [myUserDefaults integerForKey:myKey]; 
    return [NSNumber numberWithInteger: returnInt]; 
} 
+0

如果您已經編寫了代碼,爲什麼不測試代碼並找出答案? –

+0

@HaydenHolligan @因爲在某些情況下,可能會有很多工作和/或沒有回頭路,所以我希望至少有初步警告或確認這是可行的理論。 – helloB

回答

3

您可以使用isKindOfClass:治療NSData特別,因爲你所做的一切,只是我不會理會拆箱整隻REBOX它。以下方法處理並返回任何類型。

注意:不需要轉換未歸檔的數據,因爲編譯器不會在意您返回id

- (id)stuffForKey:(NSString *)key { 
    id value = [[NSUserDefaults standardUserDefaults] objectForKey:key]; 
    if ([value isKindOfClass:[NSData class]]) { 
     // then it must be an archived object 
     NSData *dataValue = (NSData *)value; 
     return [NSKeyedUnarchiver unarchiveObjectWithData:dataValue]; 
    } 
    return value; 
} 
+0

非常感謝這個有用的答案。 – helloB

+0

@helloB不客氣。事實上,這個方法可能是一個類方法,因爲它不使用任何實例變量。你可以把它放在你的'Utils'類中,也許...... – trojanfoe

相關問題