保存和加载图片的正确方法

Jos*_*el. 9 cocoa-touch objective-c uiimage ios

我正在制作一个小应用程序,用户可以在其中创建游戏配置文件,输入一些数据和可以用相机拍摄的照片.

我借助于保存了大部分配置文件数据NSUserDefaults,但朋友不鼓励我保存配置文件图像NSUserDefault.

在我的应用程序中本地保存和检索图像的正确方法是什么?

Raf*_*fAl 18

你应该将其保存在DocumentsCache文件夹.这是怎么做的.

保存Documents文件夹:

NSString* path = [NSHomeDirectory() stringByAppendingString:@"/Documents/myImage.png"];

BOOL ok = [[NSFileManager defaultManager] createFileAtPath:path 
          contents:nil attributes:nil];

if (!ok) 
{
    NSLog(@"Error creating file %@", path);
} 
else 
{
    NSFileHandle* myFileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
   [myFileHandle writeData:UIImagePNGRepresentation(yourImage)];
   [myFileHandle closeFile];
}
Run Code Online (Sandbox Code Playgroud)

Documents文件夹加载:

NSFileHandle* myFileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
UIImage* loadedImage = [UIImage imageWithData:[myFileHandle readDataToEndOfFile]];
Run Code Online (Sandbox Code Playgroud)

您还可以使用UIImageJPEGRepresentation将您保存UIImageJPEG文件.如果要将其保存在Cache目录中,还可以使用:

[NSHomeDirectory() stringByAppendingString:@"/Library/Caches/"]
Run Code Online (Sandbox Code Playgroud)

  • @José和Rafal:"NSSearchPathForDirectoriesInDomains"更好,因为如果Apple决定更改其目录结构,它不会中断.一般来说,硬编码越少越好.如果您想要执行特定的API函数,请使用它.获取此路径的一种简洁方法是:`NSString*dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0]; NSString*path = [NSString pathWithComponents:[NSArray arrayWithObjects:dir,@"myImage.png",nil]];`(太糟糕了,但是它太冗长了!) (9认同)
  • 不要使用`[NSHomeDirectory()stringByAppendingString:...]`.使用`[NSSearchPathForDirectoriesInDomains(...,NSUserDomainMask,YES)objectAtIndex:0]`与`NSDocumentDirectory`或`NSCachesDirectory`. (5认同)
  • 哎呀,刚刚找到了表达我的例子的第二个语句的更好方法:`NSString*path = [dir stringByAppendingPathComponent:@"myImage.png"];` (2认同)

SNR*_*SNR 6

一种方法是使用应用程序的文档目录.这特定于应用程序,对其他应用程序不可见.
如何创建:
只需向App Delegate添加静态函数,并使用需要路径的函数.

- (NSString )applicationDocumentDirectory {
    /
     Returns the path to the application's documents directory.
     */ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}
希望它帮助..