У меня есть аналогичное требование для проекта, над которым я работал.В моих случаях я хотел локальные файлы при работе в тестовом режиме, но удаленные файлы в противном случае.
Чтобы реализовать это, я определил протокол ResourceURLProvider в файле заголовка для класса, который будет загружать файлы:
@protocol ResourceURLProvider
-(NSURL *)getURLForFile:(NSString *fileName);
@end
@interface MyFileLoader {
id<ResourceURLProvider> provider;
}
@property (nonatomic, assign) id<ResourceURLProvider> provider;
В своем классе реализации я сделал что-то вроде этого:
NSURL *url = [provider getURLForFile:@"myfile.xml"];
if (!url) {
url = // Some code to create the URL for the remote myfile.xml
}
Если вы настроили что-то подобное, вы можете реализовать свою версию провайдера (как бы вы ее ни называли) и вернуть ему URL-адрес кешированного файла, если он существует.Если нет, вы вернете nil и приведенный выше код будет использовать URL-адрес для удаленного расположения.
В отличие от моего случая, вы хотите кэшировать файл после его загрузки.Чтобы сделать это, я мог бы добавить другой метод к определенному протоколу:
@protocol ResourceURLProvider
-(NSURL *)getURLForFile:(NSString *fileName);
-(void)cacheFileData:(NSData *)data filename:(NSString *)fileName;
@end
Ваша реализация проверила бы имя файла и проверила, был ли файл уже кэширован.Если нет, NSData (содержимое файла) будет записано в ваш кэш.
Надеюсь, это поможет.