为什么在iOS 8+中无法正常保存和加载UIImages文档文件夹?

问题描述:

我一直试图保存和加载UIImages在我的应用程序的文档文件夹或最好是临时文件夹(所以每次我的应用程序被关闭的图像将被删除),但他们不能正常工作。我已经尝试了三种方法,但只有第三种方法有效,我想知道什么是正确的方法?我非常感谢任何帮助。为什么在iOS 8+中无法正常保存和加载UIImages文档文件夹?

//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]; 
+1

你想保存和文件目录检索图像。这是你的问题正确吗? –

+0

不,我的意思是为什么前两种方法不起作用?我究竟做错了什么?我是否正确地使用第三种方法在我的应用程序中使用临时文件夹来做到这一点? @MikeAlter –

+1

保存方法二看起来不错。请检查提取url加载图像,我不知道有关方法 –

我创建class允许在文档文件夹中保存

这里是.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]; 
} 
+0

非常感谢,只是一个简单的问题,如果我想将它们保存在临时文件夹中,我应该在基本路径中使用NSTemporaryDirectory()而不是NSDocumentDirectory? –

+0

虽然'Dlog'和'[FileUtility fileExists:filePath]'给了我错误。说没有类方法存在'fileExists:' –

+1

@ Reza.Ab DLog是NSLog和'fileExists:filePath'添加编辑 –

在读取文件之前,请确保它在那里存在。如果确实存在,则问题是[NSData dataWithContentsOfURL:url]其他图像未被转换为数据。

我会推荐你​​将代码分解成几条语句,而不是写一条冗长的语句,以便更好地理解它失败的地方。

+0

在第一种和第二种方法中,fileDirectoryStr返回零,但为什么?他们是苹果文档告诉我们使用的地址。但第三种方法起作用,速度慢!如果他们不这样做,最有效和最正确的方法是什么? @JitendraSingh –

+0

网址很好,我在两种方法中都看到了正确的值(不是零)。 –

+1

使用@Mike答案的FileUtility。您可以修改该文件以在单独的线程(除主线程之外)上进行读/写操作,以便在写入大文件时UI不会挂起。 –