为什么在documents文件夹中保存和加载UIImages不会';无法在iOS 8+;中正常工作;?
我一直在尝试将UIImages保存并加载到我的应用程序的Documents文件夹或temp文件夹中(因此每次我的应用程序关闭时,图像都会被删除),但它们无法正常工作。我尝试了三种方法,但只有第三种方法有效,我想知道什么是正确的方法?我非常感谢你的帮助为什么在documents文件夹中保存和加载UIImages不会';无法在iOS 8+;中正常工作;?,ios,objective-c,uiimage,nsdata,nsfilemanager,Ios,Objective C,Uiimage,Nsdata,Nsfilemanager,我一直在尝试将UIImages保存并加载到我的应用程序的Documents文件夹或temp文件夹中(因此每次我的应用程序关闭时,图像都会被删除),但它们无法正常工作。我尝试了三种方法,但只有第三种方法有效,我想知道什么是正确的方法?我非常感谢你的帮助 //First Approach, to save and load later, Doesn't work. //Saving the image NSURL *documentsDirectoryURL = [[[NSFileManage
//First Approach, to save and load later, Doesn't work.
//Saving the image
NSURL *documentsDirectoryURL = [[[NSFileManager defaultManager]
URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask]
lastObject];
NSString*fileDirectoryStr = [[documentsDirectoryURL path] stringByAppendingPathComponent:@"E1BG.png"];
NSURL *url = [NSURL URLWithString:fileDirectoryStr];
//Saving either as Jpeg
[UIImagePNGRepresentation(finalFG) writeToFile:fileDirectoryStr atomically:YES];
//Or as PNG, because I need the transparent part to be kept transparent but non of them work.
[UIImageJPEGRepresentation(finalFG, 1.0) writeToFile:fileDirectoryStr atomically:YES];
//Loading image
UIImage *loadedBGImg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];
//Returns nil
//Second approach.
//Saving the image
NSArray*pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsPath = [pathArray objectAtIndex:0];
NSString* fileDirectoryStr = [documentsPath stringByAppendingPathComponent:@"E1FG.png"];
//Again saving either as Jpeg
[UIImagePNGRepresentation(finalFG) writeToFile:fileDirectoryStr atomically:YES];
//Or as PNG, because I need the transparent part to be kept transparent but non of them work.
[UIImageJPEGRepresentation(finalFG, 1.0) writeToFile:fileDirectoryStr atomically:YES];
NSURL *url1 = [NSURL URLWithString:fileDirectoryStr];
//Loading image
UIImage *loadedImg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url1]];
//Third approach, Works but doesnt seem to be very efficient.
NSString *tmpDirectory = NSTemporaryDirectory();
//Save
NSString *tmpFileStrFG = [tmpDirectory stringByAppendingPathComponent:@"E1FG.png"];
NSURL *urlFG = [NSURL URLWithString:tmpFileStrFG];
NSData *imgDataFG = UIImagePNGRepresentation(finalFG);
[imgDataFG writeToURL:urlFG atomically:YES];
//Load
UIImage *ImggFG = [UIImage imageWithData: imgDataFG];
在读取文件之前,请确保该文件存在。如果确实存在问题,则问题出现在
[NSData dataWithContentsOfURL:url]
中,否则图像不会转换为数据
我建议您将代码分解为多个语句,而不是编写一个冗长的语句,以便更好地了解失败的地方。在读取文件之前,请确保该文件存在。如果确实存在问题,则问题出现在
[NSData dataWithContentsOfURL:url]
中,否则图像不会转换为数据
我建议您将代码分成多个语句,而不是编写一个冗长的语句,以便更好地了解失败的地方。我已经创建了
类
,它允许保存在文档文件夹中
这是.h文件
@interface FileUtility : NSObject {
}
// Folder methods
+ (NSString*)basePath;
+ (void)createFile:(NSString *)filename;
+ (void)createFile:(NSString *)filePath withData: (NSData *) imgData;
@end
和.m文件
#import "FileUtility.h"
@implementation FileUtility
// ----------------------------------------------------------------------------
#pragma mark -
#pragma mark Path methods
// -----------------------------------------------------------------------------
+ (NSString*)basePath {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSAssert([paths count] == 1, @"");
return [paths objectAtIndex:0];
}
// -----------------------------------------------------------------------------
+ (void)createFile:(NSString *)filename {
NSFileManager* manager = [NSFileManager defaultManager];
NSString * filePath = [NSString stringWithFormat:@"%@/%@", [FileUtility basePath],filename];
DLOG(@"filePath = %@", filePath);
if (![FileUtility fileExists:filePath]){
[manager createFileAtPath:filePath contents:nil attributes:nil];
}
}
// -----------------------------------------------------------------------------
+ (void)createFile:(NSString *)filePath withData: (NSData *) imgData {
NSFileManager* manager = [NSFileManager defaultManager];
DLOG(@"filePath = %@", filePath);
if (![FileUtility fileExists:filePath]){
[manager createFileAtPath:filePath contents:imgData attributes:nil];
}
}
取用这个
[[FileUtility basePath]stringByAppendingPathComponent
编辑
+ (BOOL)fileExists:(NSString *)filename {
NSFileManager* manager = [NSFileManager defaultManager];
return [manager fileExistsAtPath:filename];
}
我已经创建了
类
,它允许保存在文档文件夹中
这是.h文件
@interface FileUtility : NSObject {
}
// Folder methods
+ (NSString*)basePath;
+ (void)createFile:(NSString *)filename;
+ (void)createFile:(NSString *)filePath withData: (NSData *) imgData;
@end
和.m文件
#import "FileUtility.h"
@implementation FileUtility
// ----------------------------------------------------------------------------
#pragma mark -
#pragma mark Path methods
// -----------------------------------------------------------------------------
+ (NSString*)basePath {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSAssert([paths count] == 1, @"");
return [paths objectAtIndex:0];
}
// -----------------------------------------------------------------------------
+ (void)createFile:(NSString *)filename {
NSFileManager* manager = [NSFileManager defaultManager];
NSString * filePath = [NSString stringWithFormat:@"%@/%@", [FileUtility basePath],filename];
DLOG(@"filePath = %@", filePath);
if (![FileUtility fileExists:filePath]){
[manager createFileAtPath:filePath contents:nil attributes:nil];
}
}
// -----------------------------------------------------------------------------
+ (void)createFile:(NSString *)filePath withData: (NSData *) imgData {
NSFileManager* manager = [NSFileManager defaultManager];
DLOG(@"filePath = %@", filePath);
if (![FileUtility fileExists:filePath]){
[manager createFileAtPath:filePath contents:imgData attributes:nil];
}
}
取用这个
[[FileUtility basePath]stringByAppendingPathComponent
编辑
+ (BOOL)fileExists:(NSString *)filename {
NSFileManager* manager = [NSFileManager defaultManager];
return [manager fileExistsAtPath:filename];
}
你想从文档目录中保存和检索图像。你的问题是对的吗?不,我的意思是为什么前两种方法不起作用?我做错了什么?我在第三种方法中使用我应用程序中的临时文件夹来做这件事对吗?@MikeAltersaving for approach 2看起来不错。请检查获取url以加载图像我不确定第一种方法第二种方法根本不起作用。你能提供一种有效的方法来处理包括ios 11在内的所有ios更新吗?@Mikealter你想从文档目录保存和检索图像。你的问题是正确的吗?不,我的意思是为什么前两种方法不起作用?我做错了什么?我在做什么g在第三种方法中使用我的应用程序中的temp文件夹进行此操作是正确的吗?@MikealterSave用于方法二看起来不错。请检查获取url以加载图像,我不确定方法一。第二种方法一点也不起作用。你能提供一种有效的方法来处理包括ios 11在内的所有ios更新吗?@MikeAlterIn the first和第二种方法fileDirectoryStr返回nil,但为什么?它们是苹果文档告诉我们要使用的地址。但是第三种方法很有效,而且速度很慢!如果不是,最有效和正确的方法是什么?@JitendraSinghURLs很好,我看到了正确的值(不是nil)在这两种方法中。使用@Mike answer中的FileUtility。您可以修改该文件,以便在单独的线程(主线程除外)上执行读/写操作因此,如果您正在编写一个大文件,UI将不会挂起。谢谢,它们只是80个小UIImages。您在ios11中尝试过它们吗?它仍然会为我返回nill。@在第一种和第二种方法中,fileDirectoryStr返回nil,但为什么?它们是苹果文档告诉我们要使用的地址。但是第三种方法有效,而且太慢了!如果不是的话,最有效和正确的方法是什么?@JitendraSinghURLs很好,我在两种方法中都看到了正确的值(不是零)。使用@Mike answer中的FileUtility。您可以修改该文件,在单独的线程(主线程除外)上执行读/写操作因此,如果您正在编写一个大文件,UI将不会挂起。谢谢,它们只是80个小UIImage。您在ios11中尝试过它们吗?它仍然会为我返回nill。@Jitendrasingh非常感谢,只是一个简单的问题,如果我想将它们保存在临时文件夹中,我应该使用NSTemporaryDirectory()而不是基本路径中的NSDocumentDirectory对吗?虽然
Dlog
和[FileUtility fileExists:filePath]
给了我错误。说fileExists不存在类方法:
@Reza.Ab Dlog是NSLog和fileExists:filePath
添加到edit中为了使用临时文件夹,我应该替换NSTemporaryDirectory()NSDocumentDirectory位于基本路径右侧?我应该使用什么方法从nsfilemanager加载文件?我这样做是为了加载文件+(UIImage*)loadImageFileWithPath:(NSString*)路径{NSData*文件=[[NSData alloc]initWithContentsOfFile:path];UIImage*loadedImg=[UIImage imageWithData:文件比例:1.0];return loadedImg;}
Thank you@mikealter所以我最终修改了这样的代码,添加了一个加载映像的方法,但随后我得到了内存警告,这与整个过程正好相反。我当前使用的是file=[NSData initWithContentsOfFile:path];然后得到像myImage=[UIImage imageWithData:file scale:1.0];。我原以为imageWithData比[UIImage imageNamed:]占用的内存要少得多;@Mikealter非常感谢,只是一个简单的问题,如果我想将它们保存在临时文件夹中,我应该在基本路径中使用NSTemporaryDirectory()而不是NSDocumentDirectory,对吗?尽管Dlog
和[FileUtility fileExists:filePath]
给了我错误。说没有fileExists的类方法:
@Reza.Ab DLog是NSLog并且fileExists:filePath是在edit中添加的为了使用temp文件夹,我应该替换NSTemporaryDirectory()如果NSDocumentDirectory位于基本路径右侧,那么我应该使用什么方法从nsfilemanager加载文件?我这样做是为了加载文件+(UIImage*)loadImageFileWithPath:(NSString*)path{NSData*file=[[NSData alloc]initWithContentsOfFile:path];UIImage*loadedImg=[UIImage]