Iphone 使用UIProgressView和ASIHTTPRequest跟踪下载进度
我正在使用ASINetworkQueue下载一系列要在特定视图中显示的图像 Mi问题是,当我打开视图,然后立即关闭它时,在请求完成之前,UIProgressView尝试更新时需要一段时间,然后它崩溃(EXC_BAD_ACCESS),因为它不再存在(视图被取消)。在卸载视图之前,我尝试将委托设置为零,但没有帮助 这是负责创建队列和添加请求的代码部分Iphone 使用UIProgressView和ASIHTTPRequest跟踪下载进度,iphone,objective-c,asihttprequest,Iphone,Objective C,Asihttprequest,我正在使用ASINetworkQueue下载一系列要在特定视图中显示的图像 Mi问题是,当我打开视图,然后立即关闭它时,在请求完成之前,UIProgressView尝试更新时需要一段时间,然后它崩溃(EXC_BAD_ACCESS),因为它不再存在(视图被取消)。在卸载视图之前,我尝试将委托设置为零,但没有帮助 这是负责创建队列和添加请求的代码部分 - (void)doNetworkOperations { // Stop anything already in the queue bef
- (void)doNetworkOperations
{
// Stop anything already in the queue before removing it
[[self networkQueue] cancelAllOperations];
// Creating a new queue each time we use it means we don't have to worry about clearing delegates or resetting progress tracking
[self setNetworkQueue:[ASINetworkQueue queue]];
[[self networkQueue] setDelegate:self];
// if I have little files to download, use accurate progress
// if I have lots, it's not worth it.
if ([promosInfo count]<=4) {
[[self networkQueue] setShowAccurateProgress:YES];
}
[[self networkQueue] setDownloadProgressDelegate:progressControl];
[[self networkQueue] setRequestDidFinishSelector:@selector(requestFinished:)];
[[self networkQueue] setRequestDidFailSelector:@selector(requestFailed:)];
[[self networkQueue] setQueueDidFinishSelector:@selector(queueFinished:)];
NSInteger i=0;
for (id row in promosInfo){
NSURL *url = [NSURL URLWithString: [row objectForKey:@"imgSource"]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL: url];
[request setTag:i];
[[self networkQueue] addOperation:request];
i++;
url = nil;
request = nil;
}
[[self networkQueue] go];
}
如何让ASINetworkQueue停止跟踪进度?正如我提到的,我尝试将委托设置为nil,但似乎不起作用。我完成了以下代码并实现了进度条的功能
UIProgressView *_progressBar = [[UIProgressView alloc] init];
ASIHTTPRequest *request;
request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:trimmedString]];
[request setDelegate:self];
[request setDownloadDestinationPath:filePath];
[request setDownloadProgressDelegate:_progressBar];
[request setShowAccurateProgress:YES];
[request setShouldContinueWhenAppEntersBackground:YES];
[request setDidFinishSelector:@selector(downloadedSuccessfully:)];
[request setDidFailSelector:@selector(downloadedFailure:)];
[[[MySingleton sharedSingleton ]getProgressValue] setValue:_progressBar forKey:trimmedString];
UIProgressView *progressBar = (UIProgressView *)[[[MySingleton sharedSingleton] getProgressValue] valueForKey:[dictionary valueForKey:@"SongUrl"]];
[progressBar setFrame:CGRectMake(215, 27, 40, 10)];
[cell.contentView addSubview:progressBar];
尝试在viewDidUnload中添加此代码,以查看其是否有效
for (ASIFormDataRequest *req in [networkQueue operations]) {
[req cancel];
[req setDelegate:nil];
}
[networkQueue reset];
[networkQueue cancelAllOperations];
[networkQueue setDelegate:nil];
我最终通过更改取消请求、将委托设置为nil以及类似的从viewdiload到ViewWillDissapear:(BOOL)Animated实现了这一点。我真的认为您的解决方案可以做到,但它仍然尝试访问UIProgressView,但访问失败。
for (ASIFormDataRequest *req in [networkQueue operations]) {
[req cancel];
[req setDelegate:nil];
}
[networkQueue reset];
[networkQueue cancelAllOperations];
[networkQueue setDelegate:nil];