2012-04-26 17 views
1

私はviewWillDisappearにファイルに書き出し、viewDidLoadにメモリに読み込みたいインメモリキャッシュを持っています。私のコード:いくつかのNSLogとデバッグに基づきファイルへの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]; 
} 

、正常にファイルを書き込むようですが、それを読み取ろうとする上で、単にファイルが見つからないと言います。私は間違って何をしていますか?ありがとう。

編集:self.thumbnailsCacheは、NSDictionaryNSDataオブジェクトです。

+0

あなただけのファインダー – Bala

答えて

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

+0

おっと、私はコードを徹底的にチェックしておらず、その 'fileExistsAtPath'呼び出しをキャッチしませんでした。代わりに、NSURLの['checkResourceIsReachableAndReturnError:' method](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/)を使用してください。 occ/instm/NSURL/checkResourceIsReachableAndReturnError :)。希望が助けてくれる! –

関連する問題