为什么在documents文件夹中保存和加载UIImages不会';无法在iOS 8+;中正常工作;?

为什么在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

我一直在尝试将UIImages保存并加载到我的应用程序的Documents文件夹或temp文件夹中(因此每次我的应用程序关闭时,图像都会被删除),但它们无法正常工作。我尝试了三种方法,但只有第三种方法有效,我想知道什么是正确的方法?我非常感谢你的帮助

 //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]