2013-06-24 25 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一起,这实际上就是他们正在做的事情,他们只是让它成为你更少的样板代码。