在哪里存储最初在 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"];
将大文件存储在其他目录中将被苹果应用审核团队拒绝(正如我所面临的那样)
我的应用程序在启动时下载一个大约 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"];
将大文件存储在其他目录中将被苹果应用审核团队拒绝(正如我所面临的那样)