1

Так что в моем приложении я использую NSURLConnection для подключения к серверу и получения текста. Это, как я начинаю мой NSURLConnection:Могу ли я использовать NSURLConnection с UIProgressView?

NSMutableURLRequest * serviceRequest = [NSMutableURLRequest requestWithURL:postUrl cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0]; 
//Some other code 
[serviceRequest setValue:contentType forHTTPHeaderField:@"Content-Type"]; 
[serviceRequest setHTTPMethod:@"POST"]; 
[serviceRequest setHTTPBody:postData]; 

//Force to return size 
[serviceRequest setValue:@"" forHTTPHeaderField:@"Accept-Encoding"]; 
theConnection = [[NSURLConnection alloc] initWithRequest:serviceRequest delegate:self]; 

Сейчас он работает нормально, но я пытаюсь получить прогресс бар в моем приложении, чтобы представить прогресс этого запроса.

Теперь вот мой didReceiveResponse и методы didReceiveData:

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    dlSize = [response expectedContentLength]; 
    NSLog(@"didReceiveResponse: %f", dlSize); 
    [self.receivedData setLength:0]; 
} 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [receivedData appendData:data]; 
    dlProgress = ((float) [data length]/(float) dlSize); 
    NSLog(@"dlProgress: %f", dlProgress); 
} 

Так что это вопрос. Как вы можете видеть, у меня есть два NSLogs, но они не вызываются до тех пор, пока запрос не будет выполнен. Чтобы быть конкретным, я обращаюсь к серверу с OCR и когда это делается OCRing, и я получаю текст, то есть при вызове этих двух методов. Затем журналы вернуть что-то вроде этого:

2013-07-30 22:50:09.201 app[39381:907] didReceiveResponse: 514.000000 
2013-07-30 22:50:09.202 app[39381:907] dlProgress: 1.000000 
2013-07-30 22:54:39.651 app[39381:907] didReceiveResponse: 305.000000 
2013-07-30 22:54:39.651 app[39381:907] dlProgress: 1.000000 

Я не знаю, почему эти методы не вызываются во время запроса, но может быть кто-то на этом сайте знает, почему? В любом случае, любые советы/комментарии/предложения ценятся, поэтому я могу подключить UIProgressView.

Спасибо!

+2

Прогресс полезен только с большими загрузки. Контент менее 1 КБ - это крошечная спецификация данных, которая легко спускается в одном куске. Прогресс не полезен, пока вы не загрузите не менее 100 из kB. – rmaddy

+0

Это верно по большей части, но этот запрос может принимать (в среднем) 10 секунд или более на самых быстрых скоростях (LTE). Если бы где-то это делалось на 3GS, это может занять 15-20 секунд, и лично я думаю, что было бы неплохо иметь индикатор прогресса, если это возможно. Есть ли способ сделать это так, чтобы он был разделен на несколько кусков и обновил прогресс таким образом? –

+0

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

ответ

1

Объявление в вашем представленииView.controller.h NSURLResponse *; в этом способе только для записи:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse  *)aResponse 
    { 

    response = aResponse; 

    } 

после того, как (downData является NSMUtableData) (Progresso является UIProgressView):

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

     [downData appendData:data]; 

     float expectedLength = [response expectedContentLength]; 
     float currentLength = downData.length; 

     progresso.progress = currentLength/expectedLength; 

     if (currentLength/expectedLength == 1) { 

      //do anything 
     } 

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