gpt4 book ai didi

cocoa-touch - 在 ASINetworkQueue 中使用 UIProgressView 为 ASIHTTPRequest 显示准确的进度

转载 作者:行者123 更新时间:2023-12-04 12:13:03 25 4
gpt4 key购买 nike

摘要:我想使用表格 View 单元格内的进度条跟踪文件下载的进度。
我在 ASINetworkQueue 中使用 ASIHTTPRequest 来处理下载。
它可以工作,但进度条保持在 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 中,我创建单元格,并使用存储在请求的 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* 中的错误吗?

最佳答案

ASIHTTPRequest 只能在服务器发送 Content-Length: header 时报告进度,否则它不知道响应有多大。 (ASINetworkQueue 还在开始时发送 HEAD 请求以尝试找出文档大小。)

尝试使用 charlesproxy 或 wireshark 收集所有网络流量,查看这些 header 是否存在和/或 HEAD 请求发生了什么。

关于cocoa-touch - 在 ASINetworkQueue 中使用 UIProgressView 为 ASIHTTPRequest 显示准确的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6546287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com