簡體   English   中英

使用UIProgressView和ASIHTTPRequest跟蹤下載進度

[英]Tracking download progress with UIProgressView and ASIHTTPRequest

我正在使用ASINetworkQueue下載一系列要在特定視圖中顯示的圖像。

小米的問題是,當我打開視圖然后立即將其關閉時,在請求完成之前,嘗試更新UIProgressView會花一些時間,然后由於它不再存在而崩潰(EXC_BAD_ACCESS)(視圖已解雇)。 我嘗試將委托設置為nil,然后再卸載視圖,但這無濟於事。

這是負責創建隊列和添加請求的代碼的一部分

- (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停止跟蹤進度? 正如我提到的,我嘗試將委托設置為nil,但似乎沒有用。

我已經完成以下代碼並實現了進度欄的功能.....

  1. 在課堂上,我將下載ProgressBar並將其保存為Key的值,每個字典中的請求的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中,該值為nil,但是您必須為此重新加載表。

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並將類似的內容從ViewDidLoad設置為ViewWillDissapear:(BOOL)Animated使其工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM