2013-06-24 26 views
1

它剛剛發生在我身上我不知道如何最好地處理像這樣的情況是我從磁盤檢索一個對象,在這種情況下,我知道它只應該是NSDictionary 。但是,做出假設的做法並不是很好的編碼實踐......是檢查它是哪個類的常態,然後將其轉換爲Dictionary?Obj-C持久性和動態類型檢測

如果是這樣,我會首先檢索NSData類中的文件,然後詢問它是否是NSDictionary類?

NSString *destinationString = [NSString stringWithFormat:@"%@/%@",dataPath,filename]; 

    NSDictionary *file = [[NSDictionary alloc]initWithContentsOfFile:destinationString]; 
    if (file) { 
     return YES; 
    } 
    return NO; 
} 
+0

你看過[NSUserDefaults](http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Classes/NSUserDefaults_Class/Reference/Reference.html)嗎? –

+0

@Marcus:我將使用NSUserDefaults來做一些非常簡單的條件檢查。但爲此,我需要更好的東西。 –

回答

3

你不知道如何實現initWithContentsOfFile。很有可能它會檢查文件的開頭,看看它是否與字典匹配,如果不匹配則返回提前保留(返回nil)。它可能比首先獲取數據更有效。

根據initWithContentsOfFile的文檔,該方法檢查文件中包含的數據的類型,並且不會向您返回「錯誤」或「錯誤」對象,因此您可以確定非零對象是好。

您的代碼是否需要嘗試創建一個數組,然後字典是另一回事。

3

以您描述的方式實現持久性是相當脆弱的。任何小小的改變都會打破你的持久性解決方案並引入意外的錯誤如果你需要輕量化的持久性,你可以看看Mantle from Github。 Mantle允許您構建一個類型化的可序列化模型,您可以輕鬆將其保存到文件中並將其讀回。此外,它支持最重要的版本控制,如果您必須隨着時間推移您的模型。

+0

它是脆弱的,但是由於內部使用字典,我可以在該字典中包裝任何類,然後添加到緩存中。這只是一個小應用程序,所以它應該能夠經受一些改變。 –

2

堅持一流的模型,使您的應用程序有意義。執行NSCoding並使用NSKeyedArchiverNSKeyedUnarchiver。或者像@allprog所暗示的那樣,與Mantle一起,這實際上就是他們正在做的事情,他們只是讓它成爲你更少的樣板代碼。