Точный прогресс отображается с помощью UIProgressView для ASIHTTPRequest в ASINetworkQueue - PullRequest
7 голосов
/ 01 июля 2011

Сводка: Я хочу отслеживать ход загрузки файлов с помощью индикаторов в ячейках таблицы.Я использую ASIHTTPRequest в ASINetworkQueue для обработки загрузок.
Это работает, но индикаторы выполнения остаются на 0% и переходят прямо на 100% в конце каждой загрузки.


Подробности: Я настроил свои запросы ASIHTTPRequest и ASINetworkQueue следующим образом:

[Только фрагмент моего кода]

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

Затем в UITableViewController я создаюячеек и добавьте имя файла и UIProgressView, используя объекты, хранящиеся в словаре userInfo запроса.

- (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%.

Некоторые загрузки очень большие (более 40 Мб).

Я не делаю ничего хитрого с темами.

Читая форумы ASIHTTPRequest, кажется, я не одинок, но я не смог найти решение.Я что-то упускаю из виду?Это ошибка в ASI *?

1 Ответ

6 голосов
/ 01 июля 2011

ASIHTTPRequest может сообщать о прогрессе, только если сервер отправляет заголовки Content-Length :, иначе он не знает, насколько большим будет ответ. (ASINetworkQueue также отправляет запросы HEAD в начале, чтобы попытаться выяснить размеры документов.)

Попробуйте собрать весь сетевой трафик с помощью charlesproxy или wireshark, посмотрите, присутствуют ли эти заголовки и / или что происходит с запросами HEAD.

...