2012-04-26 89 views
1

我有一個在內存中緩存我想寫出對viewWillDisappear文件,並讀回內存上viewDidLoad。我的代碼:寫入/讀取的NSData到文件失敗

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSFileManager *fileManager = [[NSFileManager alloc] init]; 
    NSArray *fileArray = [fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask]; 
    NSString *filePath = [NSString stringWithFormat:@"%@cache_%d", [fileArray lastObject], self.index]; 
    NSURL *fileUrl = [NSURL URLWithString:filePath]; 
    if ([fileManager fileExistsAtPath:filePath]) { 
     self.thumbnailsCache = [NSDictionary dictionaryWithContentsOfURL:fileUrl]; 
    } 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    NSFileManager *fileManager = [[NSFileManager alloc] init]; 
    NSArray *fileArray = [fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask]; 
    NSString *filePath = [NSString stringWithFormat:@"%@cache_%d", [fileArray lastObject], self.index]; 
    NSURL *fileUrl = [NSURL URLWithString:filePath]; 
    [self.thumbnailsCache writeToURL:fileUrl atomically:YES]; 
} 

基於一些的NSLog和調試,這似乎已成功寫入文件,但在嘗試讀取它只是說文件找不到。我究竟做錯了什麼?謝謝。

編輯:self.thumbnailsCache是的NSDictionary對象。

+0

你查一下文件緩存目錄的文件在取景器 – Bala 2012-04-26 07:25:28

回答

3

您建立filePath不正確。

fileArray是URL的而不是NSString的(這是你的代碼是假設)的陣列。

所以,如果你正在做最後的URL爲您要使用的緩存目錄,你可以通過這樣的創建緩存文件:

NSURL * cacheURL = (NSURL *)[fileArray lastObject]; 
if(cacheURL) 
{ 
    NSURL * fileToWrite = [cacheURL URLByAppendingPathComponent: [NSString stringWithFormat:@"%@cache_%d", self.index]]; 
} 

或者,在你的代碼的情況下:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSFileManager *fileManager = [[NSFileManager alloc] init]; 
    NSArray *fileArray = [fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask]; 
    NSString *filePath = [NSString stringWithFormat:@"%@cache_%d", [fileArray lastObject], self.index]; 

    NSURL * cacheURL = (NSURL *)[fileArray lastObject]; 
    if(cacheURL) 
    { 
     NSURL * fileToRead = [cacheURL URLByAppendingPathComponent: [NSString stringWithFormat:@"%@cache_%d", self.index]]; 
     if(fileToRead && ([fileManager fileExistsAtPath:fileToRead]) { 
       self.thumbnailsCache = [NSDictionary dictionaryWithContentsOfURL:fileToRead]; 
     } 
    } 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    NSFileManager *fileManager = [[NSFileManager alloc] init]; 
    NSArray *fileArray = [fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask]; 
    NSString *filePath = [NSString stringWithFormat:@"%@cache_%d", [fileArray lastObject], self.index]; 

    NSURL * cacheURL = (NSURL *)[fileArray lastObject]; 
    if(cacheURL) 
    { 
     NSURL * fileToWrite = [cacheURL URLByAppendingPathComponent: [NSString stringWithFormat: @"%@cache_%d", self.index]]; 
     if(fileToWrite) 
     { 
      [self.thumbnailsCache writeToURL:fileToWrite atomically:YES]; 
     } 
    } 
} 
+0

'[文件管理fileExistsAtPath:]'需要一個'NSString',而不是一個'NSURL'。不存在「NSURL」的等價方法。我如何獲得'NSString'文件路徑? – Steven 2012-04-27 06:20:01

+0

哎呦,我沒有徹底檢查我的代碼,並沒有趕上'fileExistsAtPath'電話。相反,你應該使用NSURL的['checkResourceIsReachableAndReturnError:'方法(https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/ OCC/instm/NSURL/checkResourceIsReachableAndReturnError :)。希望有所幫助! – 2012-04-27 09:13:14