2012-05-22 79 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