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"); 
} 

, но его не называется в конце. Что здесь не так? Есть идеи? А также, если одновременно выполняются несколько очередей, как мы можем отличить, какая очередь завершена в конце?

Edit:

- (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. Затем в полном обратном вызове вы можете проверить, какая очередь завершена, проверив их против очередей в вашем массиве.

EDIT:

кажется, что вы забыли установить 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 go]; , все же загрузка была выполнена. Итак, похоже, что в очереди нет никакого контроля. Есть идеи? – Mithun

+0

Пожалуйста, добавьте остальную часть своего кода (как вы запустите очередь и т. Д.) На свой вопрос. Легче определить проблему, тогда – joern

+0

Я обновил код, пожалуйста, проверьте – Mithun

Смежные вопросы