带有大数组的 NSUserDefaults

NSUserDefaults with big array

我正在构建 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 每次添加新项到它时,这是一个很好的解决方案并且不影响本地 memory/app memory/writing 磁盘有问题?

我应该开始使用 Core Data 吗?

数组的主要用途之一是搜索对象。使用 CoreData 会更快吗?

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

此外,如果您存储 heavy/large 数据,它会降低您的应用程序的速度,因为它将存储在单个 plist 文件中。

并且由于应用程序上的大量数据负载,它会产生内存问题,并且在您处理 MacOS 时,您很少会发现内存问题,但就 iOS 而言,它肯定会产生问题。

我找到了 Jeffrey fulton 的非常好的博客,他在其中详细定义了我们需要或不使用 UserDefaults 的地方。

Link : UserDefaults Limitations and Alternatives

此外,添加到上面的 UserDefault 不是安全存储,因为数据很容易检索。

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

希望这会有所帮助。

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