2011-07-01 11 views
7

Podsumowanie: Chcę śledzić postęp pobierania plików za pomocą pasków postępu w komórkach widoku tabeli. Używam ASIHTTPRequest w ASINetworkQueue do obsługi pobierania.
Działa, ale paski postępu pozostają na poziomie 0% i przeskakują bezpośrednio na poziomie 100% na końcu każdego pobrania.Dokładne postępy wyświetlane z UIProgressView dla ASIHTTPRequest w ASINetworkQueue


Szczegóły: skonfigurować moje prośby ASIHTTPRequest i ASINetworkQueue ten sposób:

[tylko wyciąg z mojego kodu]

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

Następnie w UITableViewController, tworzę komórki i dodaj nazwę pliku oraz UIProgressView za pomocą obiektów przechowywanych w słowniku userInfo żądania.

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

Pasek postępu jest dodawany, a postęp ustawiony na 0%. Następnie, po zakończeniu pobierania, natychmiast przeskakują do 100%.

Niektóre pobrania są bardzo duże (ponad 40 MB).

Nic nie robię z wątkami.

Czytając fora ASIHTTPRequest, wydaje mi się, że nie jestem sam, ale nie mogłem znaleźć rozwiązania. Czy brakuje mi czegoś oczywistego? Czy to błąd w ASI *?

Odpowiedz

6

ASIHTTPRequest może raportować postęp tylko wtedy, gdy serwer wysyła nagłówki Content-Length: w przeciwnym razie nie wie, jak duża będzie odpowiedź. (ASINetworkQueue wysyła również żądania HEAD na początku, aby spróbować określić rozmiary dokumentów.)

Spróbuj zebrać cały ruch sieciowy za pomocą charlesproxy lub wireshark, sprawdź, czy te nagłówki są obecne i/lub co dzieje się z żądaniami HEAD.

+0

Pasek postępu działał, gdy nie używałem ASINetworkQueue, tylko ASIHTTPRequests. Zakładam więc, że nagłówki są w porządku. Weryfikuje się, wykrywając sieć. – Guillaume

+0

W nagłówkach nie mam informacji o długości treści. Czy to możliwe, że postęp ASIHTTPRequests pracował z tym samym serwerem, gdy nie używa kolejki? Poprosiłem twórcę strony internetowej o zmianę wysłanych nagłówków. Zobaczę jak to działa. – Guillaume

+0

Nie jestem pewien, czy to możliwe. Jedynym sposobem na pewno jest wypróbowanie poprzedniego kodu i sprawdzenie tam również nagłówków. – JosephH

Powiązane problemy