2012-05-22 167 views
1

在我的應用程序中,我使用ASINetworkQueue方法下載文件。我有n個按鈕,每個按鈕點擊不同的隊列將創建多個請求,並開始異步下載(多次下載)。它工作正常,但我無法跟蹤每個隊列何時完成。我都用過,ASINetworkQueue委託方法不叫

 [self.myQueue cancelAllOperations]; 
     [self.myQueue setDownloadProgressDelegate:currentProgress]; 
     [self.myQueue setDelegate:self]; 
     [self.myQueue setShowAccurateProgress:YES]; 
     [self.myQueue setRequestDidFinishSelector:@selector(requestFinished:)]; 
     [self.myQueue setQueueDidFinishSelector:@selector(queueComplete:)]; 

,並添加請求作爲,

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:str]]; 
          [request setDownloadProgressDelegate:currentProgress]; 
          [request setShowAccurateProgress:YES]; 
          [request setDelegate:self]; 
          [request shouldContinueWhenAppEntersBackground]; 
          [request allowResumeForFileDownloads]; 
          [request startAsynchronous]; 
          [self.myQueue addOperation:request]; 

和最後[self.myQueue go]; 和委託方法是

- (void)queueComplete:(ASINetworkQueue *)queue 
{ 
    NSLog(@"Queue completed"); 
} 

但最終它不叫。這裏出了什麼問題?任何想法? 而且,如果有多個隊列同時執行,我們如何區分哪個隊列在最後完成?

編輯:

- (void)download{ 
    UIImageView *image = (UIImageView *)[mainView viewWithTag:selectedTag]; 
    for (UIProgressView *currentProgress in [image subviews]) { 
     if ([currentProgress isKindOfClass:[UIProgressView class]]) { 
      NSLog(@"Prog tag: %d",currentProgress.tag); 
      if(currentProgress) 
      { 
       currentProgress.progress = 0.0; 
       [[self myQueue] cancelAllOperations]; 
       [self setNetworkQueue:[ASINetworkQueue queue]]; 
       [[self myQueue] setDownloadProgressDelegate:currentProgress]; 
       [[self myQueue] setDelegate:self]; 
       [[self myQueue] setShowAccurateProgress:YES]; 
       ASIHTTPRequest *request; 
       [myQueue setQueueDidFinishSelector:@selector(queueComplete:)]; 
       for (int h = 0; h < [urlArray count]; h++) { 
        request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:[urlArray objectAtIndex:h]]]; 
        [[self myQueue] addOperation:request]; 
       } 
       [[self myQueue] go]; 
      } 
     } 
    } 
} 

回答

1

將其添加到隊列前開始的請求。

[request startAsynchronous]; 

請求的開始只能由隊列處理。所以刪除該行,應該調用完整的回調。

當你有多個隊列時,你應該保持對每個隊列的引用。你可以把它們放在一個NSMutableArray中。然後在完整的回調中,您可以通過檢查隊列中的隊列來檢查哪個隊列已完成。

編輯:

看來你忘了設置您myQueue伊娃,所以這是nil和忽略所有方法調用。所以添加:

self.myQueue = [ASINetworkQueue queue]; 

要在陣列中具有多於一個的隊列:

self.queues = [NSMutableArray array] // queues is a retained property 
ASINetworkQueue *queue = [ASINetworkQueue queue]; 
[queues addObject:queue]; 
+0

我試圖,通過隱藏[請求startAsynchronous] ;,然後不進行下載。然後我隱藏了[request startAsynchronous];並隱藏[self.myQueue去]; ,仍然下載完成。所以,這看起來像隊列沒有任何控制。任何想法? – Mithun

+0

請將您的其他代碼(如何初始化隊列等)添加到您的問題中。這很容易找出問題,然後 – joern

+0

我已經更新了代碼,請檢查 – Mithun