我正在构建一个macOS应用程序。
我当前正在使用NSUserDefaults
通过以下方法保存NSMutableArray
数据:
-(void)addPhotoUrl:(NSString*)url {
[self.photosArray addObject:url];
[[NSUserDefaults standardUserDefaults] setObject:self.photosArray forKey:@"kPhotos"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
每当应用程序启动时,我都会运行以下代码来加载NSMutableArray
:
-(void)loadPhotosLike {
NSArray *myRepository = [[NSUserDefaults standardUserDefaults] arrayForKey:@"kPhotos"];
if(myRepository && [myRepository count] != 0) {
[self.photosArray addObjectsFromArray:myRepository];
}
}
直到现在为止,它都可以完美地工作,但是由于阵列真的很大(64,000个项),我开始认为这种解决方案还不够好。
存在一个问题,每次我向其中添加新项时,数组都存在于本地NSMutableArray
中并保存到NSUserDefaults
中,这是一个很好的解决方案,并且不会影响本地内存/ app内存/将问题写入磁盘?
我应该开始使用Core Data吗?
数组的主要目的之一是搜索对象。使用CoreData可以更快吗?
答案 0 :(得分:3)
根据我的经验NSUserDefaults
仅用于轻量级数据,例如可以存储在userDefaults中的一些与首选项相关的数据。
如果您存储大量数据,也会降低应用程序的运行速度,因为它存储在单个plist文件中。
由于应用程序上的大量数据负载,将导致内存问题,而当您在MacOS
上工作时,很少会发现内存问题,但就iOS而言,肯定会造成问题。
我发现 Jeffrey fulton 的博客很好,他在其中详细定义了我们需要在哪些地方使用UserDefaults或不使用它。
链接:UserDefaults Limitations and Alternatives
此外,在UserDefault上添加内容也不安全,因为可以很容易地检索数据。
在您的情况下,您可以使用Core Data或SQLIte两者都是非常强大且易于使用的用于存储数据的框架。
希望这会有所帮助。
答案 1 :(得分:0)
问题是您存储图像数据而不是文件路径。即使使用数据库来存储图像集合也不是一个好的实现。图像的大数据块将导致数据库工作缓慢。常见的实现方式是先将图像数据存储到文件系统,然后将相应的文件路径保存到图像索引存储。在这种情况下,使用UserDefaults还是CoreData进行持久存储的影响较小。