2012-03-18 50 views
0

我正在使用ASINetworkQueue下载一系列要在特定视图中显示的图像。使用UIProgressView和ASIHTTPRequest跟踪下载进度

Mi问题是当我打开视图,然后在请求结束之前立即关闭视图,需要一段时间UIProgressView试图更新,然后崩溃(EXC_BAD_ACCESS),因为它不再存在(该观点被驳回)。我试图在卸载视图之前将代理设置为零,但它没有帮助。

这是负责创建队列中的部分代码并添加请求

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

和我有以下viewDidUnload

- (void)viewDidUnload 
{ 
    [[self networkQueue] setDownloadProgressDelegate:nil]; 
    [[self networkQueue] cancelAllOperations]; 
    [self setNetworkQueue:nil]; 
    [self setCargando:nil]; 
    [self setScrollView:nil]; 
    [self setPageControl:nil]; 
    [self setStatusLabel:nil]; 
    [self setProgressControl:nil]; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

我如何告诉ASINetworkQueue停止追踪进展?正如我所提到的,我尝试将委托设置为零,但它似乎没有工作。

回答

0

我也做了下面的代码,实现进度条的功能.....

  1. 在课堂上我要去的地方,下载和保存进度为每一个不同的密钥具有URL的值请求字典,然后将该字典保存到类名Singleton中。

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

然后在我要去的地方,以显示进度条的视图控制器,我写了下面的代码:它读取表从字典中的每个单元的进度条从Singleton类和展示价值。如果完成它不显示,因为在DIC值将为零,但你必须重新加载表。

UIProgressView *progressBar = (UIProgressView *)[[[MySingleton sharedSingleton] getProgressValue] valueForKey:[dictionary valueForKey:@"SongUrl"]]; 
    [progressBar setFrame:CGRectMake(215, 27, 40, 10)]; 
    [cell.contentView addSubview:progressBar]; 
0

尝试在viewDidUnload中添加此代码以查看其是否有效。

for (ASIFormDataRequest *req in [networkQueue operations]) { 
    [req cancel]; 
    [req setDelegate:nil]; 
} 

[networkQueue reset]; 
[networkQueue cancelAllOperations]; 
[networkQueue setDelegate:nil]; 
+0

我真的很喜欢你的解决方案,但它仍然会尝试访问UIProgressView并且访问不良。 – Daniel 2012-03-18 18:36:51

+0

我已编辑答案,请再次添加此代码 – Lunayo 2012-03-18 18:44:23

-2

我终于做到了通过改变取消请求,委托设为零,从viewDidLoad中到ViewWillDissapear类似的工作:(BOOL)动画。