Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用UIProgressView和ASIHTTPRequest跟踪下载进度_Iphone_Objective C_Asihttprequest - Fatal编程技术网

Iphone 使用UIProgressView和ASIHTTPRequest跟踪下载进度

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

我正在使用ASINetworkQueue下载一系列要在特定视图中显示的图像

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

如何让ASINetworkQueue停止跟踪进度?正如我提到的,我尝试将委托设置为nil,但似乎不起作用。

我完成了以下代码并实现了进度条的功能

  • 在类中,我将下载progressBar并将其保存为键的值,在字典中每个请求的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类的dictionary中读取每个单元格进度条的值,并显示在表中。如果完成,它不会显示,因为在dic中,该值将为零,但您必须为此重新加载表

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