2012-04-26 2 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.thumbnailsCacheNSDictionaryNSData объектов.

+0

вы просто проверить файл в каталоге кэша документов в искателе – Bala

ответ

3

Неправильное создание вашего filePath.

fileArray - это массив URL-адресов, а не NSStrings (что и предполагает ваш код).

Так что, если вы принимаете последний 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

'[FileManager fileExistsAtPath:]' 'принимает NSString', а не' NSURL'. Эквивалентный метод для 'NSURL' не существует. Как получить путь к файлу 'NSString'? – Steven

+0

Упс, я не полностью проверил свой код и не поймал этот вызов 'fileExistsAtPath'. Вместо этого вы должны использовать метод [checkResourceIsReachableAndReturnError: 'NSURL] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/ ОКК/instm/NSURL/checkResourceIsReachableAndReturnError :). Надеюсь, это поможет! –

Смежные вопросы