NSUserDefaults大数组

时间:2018-10-24 10:46:08

标签: objective-c macos core-data nsuserdefaults

我正在构建一个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可以更快吗?

2 个答案:

答案 0 :(得分:3)

根据我的经验NSUserDefaults仅用于轻量级数据,例如可以存储在userDefaults中的一些与首选项相关的数据。

如果您存储大量数据,也会降低应用程序的运行速度,因为它存储在单个plist文件中。

由于应用程序上的大量数据负载,将导致内存问题,而当您在MacOS上工作时,很少会发现内存问题,但就iOS而言,肯定会造成问题。

我发现 Jeffrey fulton 的博客很好,他在其中详细定义了我们需要在哪些地方使用UserDefaults或不使用它。

链接:UserDefaults Limitations and Alternatives

此外,在UserDefault上添加内容也不安全,因为可以很容易地检索数据。

在您的情况下,您可以使用Core Data或SQLIte两者都是非常强大且易于使用的用于存储数据的框架。

希望这会有所帮助。

答案 1 :(得分:0)

问题是您存储图像数据而不是文件路径。即使使用数据库来存储图像集合也不是一个好的实现。图像的大数据块将导致数据库工作缓慢。常见的实现方式是先将图像数据存储到文件系统,然后将相应的文件路径保存到图像索引存储。在这种情况下,使用UserDefaults还是CoreData进行持久存储的影响较小。