2011-07-01 3 views
7

요약 : 테이블 뷰의 셀 안에 진행률 표시 줄이있는 파일 다운로드 진행률을 추적하고자합니다. 다운로드를 처리하기 위해 ASINetworkQueue에서 ASIHTTPRequest를 사용하고 있습니다.
작동하지만 진행 막대는 0 %에 머물러 있으며 다운로드가 끝날 때마다 100 %로 바로 이동합니다.ASINetworkQueue에서 ASIHTTPRequest에 대한 UIProgressView로 정확한 진행 상황이 표시됩니다.


세부하십시오있는 UITableViewController에, 내가 작성,

- (void) startDownloadOfFiles:(NSArray *) filesArray { 

    for (FileToDownload *aFile in filesArray) { 

     ASIHTTPRequest *downloadAFileRequest = [ASIHTTPRequest requestWithURL:aFile.url]; 

     UIProgressView *theProgressView = [[UIProgressView alloc] initWithFrame:CGRectMake(20.0f, 34.0f, 280.0f, 9.0f)]; 
     [downloadAFileRequest setDownloadProgressDelegate:theProgressView]; 

     [downloadAFileRequest setUserInfo: 
      [NSDictionary dictionaryWithObjectsAndKeys:aFile.fileName, @"fileName", 
                 theProgressView, @"progressView", nil]]; 
     [theProgressView release]; 

     [downloadAFileRequest setDelegate:self]; 
     [downloadAFileRequest setDidFinishSelector:@selector(requestForDownloadOfFileFinished:)]; 
     [downloadAFileRequest setDidFailSelector:@selector(requestForDownloadOfFileFailed:)]; 
     [downloadAFileRequest setShowAccurateProgress:YES]; 

     if (! [self filesToDownloadQueue]) { 
      // Setting up the queue if needed 
      [self setFilesToDownloadQueue:[[[ASINetworkQueue alloc] init] autorelease]]; 

      [self filesToDownloadQueue].delegate = self; 
      [[self filesToDownloadQueue] setMaxConcurrentOperationCount:2]; 
      [[self filesToDownloadQueue] setShouldCancelAllRequestsOnFailure:NO]; 
      [[self filesToDownloadQueue] setShowAccurateProgress:YES]; 

     } 

     [[self filesToDownloadQueue] addOperation:downloadAFileRequest]; 
    }   

    [[self filesToDownloadQueue] go]; 
} 

그런

[내 코드 만 추출물] : 나는 나의 ASIHTTPRequest 요청과 ASINetworkQueue이 방법을 설정 요청의 userInfo 사전에 저장된 객체를 사용하여 파일 이름과 UIProgressView를 추가하십시오.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"fileDownloadCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"FileDownloadTableViewCell" owner:self options:nil]; 
     cell = downloadFileCell; 
     self.downloadFileCell = nil; 
    } 

    NSDictionary *userInfo = [self.fileBeingDownloadedUserInfos objectAtIndex:indexPath.row]; 

    [(UILabel *)[cell viewWithTag:11] setText:[NSString stringWithFormat:@"%d: %@", indexPath.row, [userInfo valueForKey:@"fileName"]]]; 

    // Here, I'm removing the previous progress view, and adding it to the cell 
    [[cell viewWithTag:12] removeFromSuperview]; 
    UIProgressView *theProgressView = [userInfo valueForKey:@"progressView"]; 
    if (theProgressView) { 
     theProgressView.tag = 12; 
     [cell.contentView addSubview:theProgressView]; 
    } 


    return cell; 
} 

진행률 표시 줄이 모두 추가되고 진행률이 0 %로 설정됩니다. 그런 다음 다운로드가 끝나면 즉시 100 %로 이동합니다.

다운로드 중 일부는 (40Mb 이상) 매우 큽니다.

스레드와 관련해서는 아무 것도하지 않습니다.

ASIHTTPRequest의 포럼을 읽는 것만으로도 혼자가 아닌 것처럼 보이지만 해결책을 찾지 못했습니다. 나는 명백한 무엇인가 놓치고 있냐? ASI *의 버그입니까?

답변

6

ASIHTTPRequest는 서버가 Content-Length : 헤더를 보내는 경우에만 진행 상황을보고 할 수 있으며 그렇지 않은 경우 응답의 크기를 알 수 없습니다. (ASINetworkQueue는 처음에 문서 크기를 알아 내려고 HEAD 요청을 보냅니다.)

charlesproxy 또는 wireshark를 사용하여 모든 네트워크 트래픽을 수집하고 이러한 헤더가 있는지 및/또는 HEAD 요청이 일어나고 있는지 확인하십시오.

+0

ASINetworkQueue를 사용하지 않을 때 진행 막대가 작동 중이며 ASIHTTPRequests 만 있습니다. 그래서 헤더가 괜찮다고 가정합니다. 네트워크 스니핑으로 확인합니다. – Guillaume

+0

헤더에는 콘텐츠 길이 정보가 없습니다. ASIHTTPRequests의 진행 상황이 대기열을 사용하지 않을 때 동일한 서버로 작업 할 수 있습니까? 웹 개발자에게 보낸 헤더를 변경하도록 요청했습니다. 그것이 어떻게되는지 보게 될 것입니다. – Guillaume

+0

가능한지 확실하지 않습니다. 확실히 알 수있는 유일한 방법은 이전 코드를 시도하고 헤더도 확인하는 것입니다. – JosephH