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 *?
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
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
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