Как получить оставшееся время загрузки от асинхронного запроса?

Я пытаюсь загрузить изображение с iPhone на сервер. Я могу это сделать, но мне нужно показать индикатор. Мой код

NSData *imageData = UIImageJPEGRepresentation(newImage, 90);

// setting up the URL to post to
NSString *urlString = [NSString stringWithFormat:@"URL",[[formater stringFromDate:now] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// setting up the request object now
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ;
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
  NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
 NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"ipodfile.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// setting the body of the post to the reqeust
[request setHTTPBody:body];

Вот код для запуска запроса.

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]);
 }];

Итак, как я могу рассчитать оставшееся время, чтобы показать индикатор? Спасибо за ваше время.


person Community    schedule 28.02.2013    source источник
comment
возможный дубликат Как сделать индикатор выполнения NSURLConnection при загрузке файла?   -  person lxt    schedule 28.02.2013
comment
@lxt, спасибо, что уделили время. Но я не ищу этого. Я знаю методы делегата NSURLconnection, но я выполняю загрузку внутри блока в отдельном потоке.   -  person    schedule 28.02.2013


Ответы (2)


Вы можете использовать этот метод делегата подключения:

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

(Как мне обернуть такие длинные имена аргументов?)
Этого нет в документации NSURLConnectionDataDelegate, но если вы проверите общедоступный заголовок NSURLConnection.h, он там. Так что не беспокойтесь об этом.

Из документации Руководство по программированию системы загрузки URLИспользование NSURLConnection:

Оценка прогресса загрузки

Вы можете оценить ход загрузки HTTP POST с помощью метода делегата connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:. Обратите внимание, что это не точное измерение прогресса загрузки, потому что соединение может не работать или соединение может столкнуться с проблемой аутентификации.

person Tricertops    schedule 28.02.2013
comment
Привет, @iMartin Спасибо за ответ. Я уже добавил это в свой код, но этот метод не вызывается. Я также добавил NSURLConnectionDelegate в файл .h. это из-за следующего кода? [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { NSLog(@"Finished with status code: %i", [(NSHTTPURLResponse *)response statusCode]); }]; - person ; 28.02.2013
comment
Да, вам придется использовать другие методы, потому что вам нужно установить делегат. Например, используйте –initWithRequest:delegate:, а затем -start. Затем реализуйте несколько других методов делегата для проверки завершения или ошибки. - person Tricertops; 01.03.2013

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

person CainaSouza    schedule 28.02.2013
comment
Привет, @CainaSouza Спасибо за ответ. Я не хочу использовать стороннюю библиотеку для этой небольшой задачи. Этот комплект пригодится для решения сложных задач. - person ; 28.02.2013