在哪里存储最初在 IOS 应用程序中获取的大文件

Where to store large files fetched initially in a IOS App

我的应用程序在启动时下载一个大约 300MB 的 sqlite 数据库。下载完成后,这个 sqlite 数据库应该在应用程序安装期间可用(几年 :-))。我不知道在哪里存储这些文件。

我开始将数据存储在如下库路径中(swift)

var sDataPath = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true);

不,我意识到此路径在使用 IOS 模拟器进行开发和测试期间会发生变化。例子: 1. 我第一次在 OIS Simulator 中启动应用程序。评估路径是

[/Users/user/Library/Developer/CoreSimulator/Devices/19E2CB7E-3ABB-4C0A-8B49-39A0BE392A93/data/Containers/Data/Application/5EE51B55-0A89-45FB-A1E2-9BE3DCD33463/Library]

2。该应用程序下载数据。这需要几分钟时间。 3.我关闭模拟器并重新启动xcode 4. 我在模拟器中再次启动该应用程序,并希望在我的应用程序的库路径中包含已下载的数据。但不是 ... 5. 应用评估一个新路径,路径中有另一个ID:

[/Users/user/Library/Developer/CoreSimulator/Devices/19E2CB7E-3ABB-4C0A-8B49-39A0BE392A93/data/Containers/Data/Application/429206E9-00EA-45EF-BE6E-4B2E9374BAF5/Library]

6。然后应用会再次下载内容。

我希望在设备的整个生命周期内拥有一个静态路径。我做错了什么或者我应该改变什么?

您应该将下载的图像保存到文档目录。通过这种方式,图像可以快速加载。如果您想克服重新加载单元格的问题,那么您必须检查文件路径是否存在填充。

- (NSString *)documentsPathForFileName:(NSString *)name folder:(NSString*)folderName{
    return [[self pathToPatientPhotoFolder:folderName] stringByAppendingPathComponent:name];
}

- (NSString *)pathToPatientPhotoFolder:(NSString *)folderName {
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                                    NSUserDomainMask,
                                                                    YES) lastObject];
    NSString *patientPhotoFolder = [documentsDirectory stringByAppendingPathComponent:folderName];

    // Create the folder if necessary
    BOOL isDir = NO;
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    if (![fileManager fileExistsAtPath:patientPhotoFolder
                       isDirectory:&isDir] && isDir == NO) {
        [fileManager createDirectoryAtPath:patientPhotoFolder
           withIntermediateDirectories:NO
                            attributes:nil
                                 error:nil];
    }
    return patientPhotoFolder;
}

在你的 cellForRowAtIndexPath: 方法中

{…..

NSURL *urla = [NSURL URLWithString:[NSString stringWithFormat:@"%@",[self.imagearray objectAtIndex:indexPath.item]]];
    NSString *thumbnailCacheKey = [NSString stringWithFormat:@"thumb-%@",[self.imageIDarray objectAtIndex:indexPath.item]];;
    UIImage *image = [UIImage imageWithContentsOfFile:[self documentsPathForFileName:thumbnailCacheKey folder:@"thumb"]];

if (!image){
    //first download image here and then save that image like:
    NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"thumb"];
    // New Folder is your folder name
    NSError *error = nil;
            if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
                [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];

            NSString *filePath = [stringPath stringByAppendingPathComponent:thumbnailCacheKey];
            NSData *pngData = UIImageJPEGRepresentation(image, 0.8);
                [pngData writeToFile:filePath atomically:YES];
}
else{// image is already downloaded, so just set that image
    cell.imageView.image = image;
}
….
}

此代码在您的 DocumentDirectory 中创建文件夹并在其中保存图像并从中获取图像。我用一个唯一的 photoID 保存,这样图像就不会相同。您可以根据您的要求进行保存。

路径在模拟器上正在改变,但在真实设备上是相同的。

如果我没记错的话,在模拟器上每次重启时路径都会改变。在设备上,仅当您删除并重新安装您的应用程序时,该路径才会更改。

您应该将其存储在缓存文件夹中。

NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"file.plist"];

将大文件存储在其他目录中将被苹果应用审核团队拒绝(正如我所面临的那样)