[英]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,但似乎沒有用。
我已經完成以下代碼並實現了進度欄的功能.....
在課堂上,我將下載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.