Как скачать файлы из интернета и сохранить в «Документах» на iPhone? - PullRequest
5 голосов
/ 26 августа 2009

У меня на удаленном сервере есть папка с несколькими файлами .png. Я хочу загрузить их из своего приложения и сохранить в папке «Приложения». Как я могу это сделать?

1 Ответ

13 голосов
/ 26 августа 2009

Самый простой способ - использовать удобные методы NSData initWithContentOfURL: и writeToFile:atomically: для получения и записи данных соответственно. Имейте в виду, что это синхронно и будет блокировать любой поток, в котором вы его выполняете, до тех пор, пока выборка и запись не будут завершены.

Например:

// Create and escape the URL for the fetch
NSString *URLString = @"http://example.com/example.png";
NSURL *URL = [NSURL URLWithString:
              [URLString stringByAddingPercentEscapesUsingEncoding:
                          NSASCIIStringEncoding]];

// Do the fetch - blocks!
NSData *imageData = [NSData dataWithContentsOfURL:URL];
if(imageData == nil) {
    // Error - handle appropriately
}

// Do the write
NSString *filePath = [[self documentsDirectory] 
                      stringByAppendingPathComponent:@"image.png"];
[imageData writeToFile:filePath atomically:YES];

Где метод documentsDirectory бесстыдно украден у этого вопроса :

- (NSString *)documentsDirectory {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    return [paths objectAtIndex:0];
}

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

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the data to some preexisting @property NSMutableData *dataAccumulator;
    [self.dataAccumulator appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Do the write
    NSString *filePath = [[self documentsDirectory] 
                          stringByAppendingPathComponent:@"image.png"];
    [imageData writeToFile:filePath atomically:YES];
}

Мелкие детали, такие как объявление dataAccumulator и обработка ошибок, оставлены читателю:)

Важные документы:

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