1

所以在我的应用程序中,我使用 NSURLConnection 连接到服务器并检索文本。这就是我启动 NSURLConnection 的方式:

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);
}

所以这就是问题所在。如您所见,我在那里有两个 NSLog,但在请求完成之前不会调用它们。具体来说,我正在联系服务器以进行 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。

谢谢!

4

1 回答 1

1

在 yourViewController.h 中声明 NSURLResponse *response; 在这个方法中只写:

 - (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
      }

      }
于 2013-07-31T08:08:24.427 回答