2017-08-30 64 views
0

我一直試圖保存和加載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加載圖像,我不知道有關方法 –

回答

1

我創建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'添加編輯 –

2

在讀取文件之前,請確保它在那裏存在。如果確實存在,則問題是[NSData dataWithContentsOfURL:url]其他圖像未被轉換爲數據。

我會推薦你​​將代碼分解成幾條語句,而不是寫一條冗長的語句,以便更好地理解它失敗的地方。

+0

在第一種和第二種方法中,fileDirectoryStr返回零,但爲什麼?他們是蘋果文檔告訴我們使用的地址。但第三種方法起作用,速度慢!如果他們不這樣做,最有效和最正確的方法是什麼? @JitendraSingh –

+0

網址很好,我在兩種方法中都看到了正確的值(不是零)。 –

+1

使用@Mike答案的FileUtility。您可以修改該文件以在單獨的線程(除主線程之外)上進行讀/寫操作,以便在寫入大文件時UI不會掛起。 –

相關問題