2011-07-21 4 views
2

мое приложение загружает видео из Интернета и сохраняет его в iPhone.Знать процесс загрузки для обновления UIprogressView

Я использую этот код

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 

[request setHTTPMethod:@"GET"]; 
NSError *error; 
NSURLResponse *response; 


NSString *documentFolderPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSString *videosFolderPath = [documentFolderPath stringByAppendingPathComponent:@"videos"]; 

//Check if the videos folder already exists, if not, create it!!! 
BOOL isDir; 
if (([fileManager fileExistsAtPath:videosFolderPath isDirectory:&isDir] && isDir) == FALSE) { 
    [[NSFileManager defaultManager] createDirectoryAtPath:videosFolderPath withIntermediateDirectories:YES attributes:nil error:nil]; 
} 

NSString *filePath = [videosFolderPath stringByAppendingPathComponent:@"name.mp4"]; 

if ([fileManager fileExistsAtPath:filePath ] == YES) { 
    NSLog (@"File exists"); 
} 
else { 
    NSLog (@"File not found"); 
    NSData *urlData; 
    NSString *downloadPath = @"http://www.mywebsite.com/name.mp4"; 
    [request setURL:[NSURL URLWithString:downloadPath]]; 
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    BOOL written = [urlData writeToFile:filePath atomically:NO]; 
    if (written) 
     NSLog(@"Saved to file: %@", filePath); 
    else {NSLog(@"problem");} 
} 

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

проблема (я думаю, но я не уверен), что мой NSURLConnection не имеет себя в качестве делегата, так как методы

- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data 

или

-(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{ 

никогда не называются.

Я пытался использовать

urlData = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

, но сбои приложения, когда я пытаюсь записать файл

[urlData writeToFile:filePath atomically:NO]; 

Что я могу сделать? Спасибо

ответ

5

Что вы делаете, это отправка «синхронного» запроса, что означает, что поток, который загружает HTTP-ответ, будет зависать до тех пор, пока все данные не будут извлечены. Никогда не бывает так хорошо работать с потоком пользовательского интерфейса, даже если вы не хотите отображать какой-либо индикатор прогресса загрузки. Я предлагаю использовать класс NSURLConnection, задав его делегат и отвечая на методы делегирования. Небольшой учебник для этого можно найти по адресу http://snippets.aktagon.com/snippets/350-How-to-make-asynchronous-HTTP-requests-with-NSURLConnection.

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

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response; 
    contentSize = [httpResponse expectedContentLength]; 
} 

Затем рассчитать общий ход загрузки при получении новых данных, делать что-то вроде этого :

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // download data is our global NSMutableData object that contains the 
    // fetched HTTP data. 
    [downloadData appendData:data]; 
    float progress = (float)[downloadData length]/(float)contentSize; 
    [progressView setValue:progress]; 
} 

UPDATE:

Другой пример того, как сделать асинхронной HTTP с Фондом: http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/

+0

Хорошо, Thaks! оно работает! Но теперь у меня есть один вопрос: используя мои старые методы, я мог бы получить видео с помощью «папки с документами», это было легко ...Теперь, где видео, которое я загрузил? Как я могу узнать путь (также для проверки, если он уже существует и т. Д.)? благодаря! – JAA

+0

Извините, я могу использовать [nameFile writeToFile: Path автоматически: NO] для записи, и 'fileExists', чтобы проверить, доступно ли это! благодаря! – JAA

+0

Не могли бы вы уточнить ссылку. Это невозможно. Спасибо – Vinh

1

Здесь вы используете синхронный запрос.

В документе указано - Синхронная нагрузка построена поверх асинхронного кода загрузки, предоставляемого классом. Вызывающий поток блокируется, в то время как асинхронная система загрузки выполняет загрузку URL-адреса для потока, созданного специально для этого запроса на загрузку. Для выполнения синхронной нагрузки в вызывающем потоке не требуется специальной конфигурации нитей или цикла цикла.

отсылает ссылку на класс here

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

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

  • Нет связанных вопросов^_^