Ios Obj-C持久性和动态类型检查

Ios Obj-C持久性和动态类型检查,ios,objective-c,Ios,Objective C,我突然想到,我不知道如何最好地处理这样的情况,因为我正在从磁盘检索对象,在这种情况下,我知道它应该是NSDictionary类型。但是,做出这样的假设并不是很好的编码实践。。。规范是检查它是哪个类,然后将其转换为字典吗 如果是这样,我会首先在NSData类中检索该文件,然后询问它是否是NSDictionary类吗 NSString *destinationString = [NSString stringWithFormat:@"%@/%@",dataPath,filename];

我突然想到,我不知道如何最好地处理这样的情况,因为我正在从磁盘检索对象,在这种情况下,我知道它应该是
NSDictionary
类型。但是,做出这样的假设并不是很好的编码实践。。。规范是检查它是哪个类,然后将其转换为字典吗

如果是这样,我会首先在
NSData
类中检索该文件,然后询问它是否是
NSDictionary
类吗

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

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

您不知道
initWithContentsOfFile
是如何实现的。很可能它会检查文件的开头,看看它是否与字典匹配,如果不匹配,它会提前退出(返回
nil
)。这可能比先获取数据要高效得多

根据
initWithContentsOfFile
的文档,该方法检查文件中包含的数据类型,不会向您返回“坏”或“错”对象,因此您可以确保非nil对象是好的


您的代码是否需要尝试创建一个数组,然后创建一个字典是另一回事。

您不知道
initWithContentsOfFile
是如何实现的。很可能它会检查文件的开头,看看它是否与字典匹配,如果不匹配,它会提前退出(返回
nil
)。这可能比先获取数据要高效得多

根据
initWithContentsOfFile
的文档,该方法检查文件中包含的数据类型,不会向您返回“坏”或“错”对象,因此您可以确保非nil对象是好的


您的代码是否需要尝试创建一个数组,然后再创建一个字典是另一回事。

以您描述的方式实现持久性是非常脆弱的。任何微小的更改都可能破坏持久性解决方案并引入意外错误。如果你需要轻量的坚持,你可以看看。Mantle允许您构建一个类型化的可序列化模型,您可以轻松地将其保存到文件中并将其读回。此外,它还支持版本控制,如果您必须随着时间的推移改进您的模型,这一点非常重要。

以您描述的方式实现持久性是非常脆弱的。任何微小的更改都可能破坏持久性解决方案并引入意外错误。如果你需要轻量的坚持,你可以看看。Mantle允许您构建一个类型化的可序列化模型,您可以轻松地将其保存到文件中并将其读回。此外,它还支持版本控制,如果您必须随着时间的推移改进您的模型,这一点非常重要。

保持对您的应用程序有意义的一流模型。执行
NSCoding
并使用
NSKeyedArchiver
NSKeyedArchiver
。或者,正如@allprog所建议的,使用Mantle,这就是他们所做的,他们只是让它不再像样板代码那样适合您。

保持对您的应用程序有意义的一流模型。执行
NSCoding
并使用
NSKeyedArchiver
NSKeyedArchiver
。或者,正如@allprog所建议的,使用Mantle,这就是他们所做的,他们只是让它少了一些样板代码。

是的,但由于内部使用字典,我可以在字典中包装任何类,然后添加到缓存中。它只是一个小应用程序,所以应该能够经受一些更改。它是脆弱的,是的,但是由于内部使用字典,我可以在字典中包装任何类,然后添加到缓存中。这只是一个小应用程序,所以它应该能够经受一些变化。你看过吗?@Marcus:我将使用NSUserDefaults来做一些非常简单的条件检查。但是为了这个,我需要更好的东西。你看了吗?@Marcus:我要用NSUserDefaults做一些非常简单的条件检查。但为了这个,我需要更好的东西。