Как загрузить файлы в файловую систему iPhone? - PullRequest
0 голосов
/ 18 марта 2011

Я бы хотел загрузить несколько файлов PDF с веб-сайта в файловую систему iPhone в моем приложении.Потому что я не хочу загружать файлы каждый раз, когда запускаю приложение.

В документации я нашел функцию под названием «dataWithContentsOfURL», но пример кода мне не помог.Это правильный путь или есть более простое решение?

Может кто-нибудь дать мне совет или два?; -)

приветствует макс.

Ответы [ 5 ]

5 голосов
/ 18 марта 2011

Я рекомендую использовать ASIHTTPRequest , он хорошо написан, задокументирован и прост в использовании, вот быстрый пример из одного из моих классов загрузки приложений, который загружает файл JSON с помощью ASIHTTPRequest:

-(void)downloadJSONData:(NSString *)path destination:(NSString *)destination secure:(BOOL)secure {

    if (![self queue]) {
        [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];
    }

    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:destination error:NULL];

    NSURL *url = [NSURL URLWithString:path];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    if(secure){
        [request addRequestHeader:@"Authorization" value:[NSString stringWithFormat:@"Basic %@",[ASIHTTPRequest base64forData:[[NSString stringWithFormat:@"%@:%@",self.username,self.password] dataUsingEncoding:NSUTF8StringEncoding]]]];
    }
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestDone:)];
    [request setDidFailSelector:@selector(requestWentWrong:)];
    [request setDownloadDestinationPath:destination];
    [[self queue] addOperation:request]; //queue is an NSOperationQueue
}

Я бы посмотрел на страницу с инструкциями по использованию , так как она содержит все, что вам нужно знать.

1 голос
/ 18 марта 2011

Не используйте dataWithContentsOfURL:, если вы не выполняете его где-то кроме основного потока.Это блокирующий API и доступ к сети.Это рецепт плохого взаимодействия с пользователем.

Подумайте об этом: вы используете блокирующий API для доступа к сети, но сеть не работает или работает очень медленно.Основной поток теперь заблокирован, поэтому ваш пользовательский интерфейс не отвечает на взаимодействие с пользователем.Пользователь расстроен и пытается отменить загрузку, используя удобную кнопку, которую вы положили на пользовательский интерфейс, но "О НЕТ!"он не работает, потому что пользовательский интерфейс заблокирован.

Не используйте API блокировки в главном потоке.

Вы должны ознакомиться с документацией для NSURLConnection и ее асинхронными методами загрузки для загрузкиданные.

1 голос
/ 18 марта 2011

Да, вы можете загружать файлы только по мере необходимости (Ленивая загрузка).

Когда вы захотите получить доступ к файлам. Проверьте в каталоге документов для файла. Во втором ответе это уточняется. Добавьте имя файла с путем к документам. Проверьте, существует ли читаемый файл, используя метод isReadableFileAtPath: экземпляр NSFileManager. если он возвращает false, инициируйте загрузку pdf с веб-сайта.

Пожалуйста, не забудьте создать класс, который загружает файл асинхронно. Вы можете использовать NSURLconnection для инициирования запроса и методы его делегата для обработки его содержимого. После загрузки содержимого запишите его в папку документов.

Если бы вы могли создать класс для асинхронной загрузки, вы могли бы инициировать параллельные загрузки и максимально использовать пропускную способность.

Выполняя асинхронную загрузку, вы можете убедиться, что ваше приложение реагирует даже во время загрузки файлов.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

С уважением,

Джексон Санни Родригес

1 голос
/ 18 марта 2011

Вы на правильном пути

-(void)downloadURL:(NSURL *)theUrl toLocalFileURL:(NSURL *)localURL
{
     NSData *dlData = [NSData dataWithContentsOfURL:theURL];
     [dlData writeToURL:localURL atomically:YES];
}

Итак, просто изучите, как создаются NSURL для локальных и удаленных объектов, и все готово.

0 голосов
/ 18 марта 2011

Вы должны использовать

NSData* pdf_data = [NSData dataWithContentsOfFile: @"file_path"];

где file_path - это путь, по которому вы сохранили файл (обычно это каталоги документов или библиотек).

Для сохранения данных используйте:

[pdf_data writeToFile: @"file_path" atomically: YES];

Чтобы получить путь к каталогу документов, вы можете использовать:

* * 1010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...