0

Я пытаюсь реализовать механизм загрузки нескольких файлов с использованием AFNetworking. Я хочу загрузить zip-файл один за другим из нескольких URL-адресов с сообщением о прогрессировании. Я пытался, как следующий код, но получаю сообщение об ошибке, как -Как загрузить несколько файлов из нескольких URL-адресов NSOperationQueue

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSOperationQueue addOperation:]: operation is already enqueued on a queue' 

Вот мой код часть:

- (void) downloadCarContents:(NSArray *)urlArray forContent:(NSArray *)contentPaths { 

    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 

    for (int i=0; i< urlArray.count; i++) { 

     NSString *destinationPath = [self.documentDirectory getDownloadContentPath:contentPaths[i]]; 

     NSLog(@"Dest : %@", destinationPath); 

     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
     AFHTTPRequestOperation *operation = [manager GET:urlArray[i] 
               parameters:nil 
               success:^(AFHTTPRequestOperation *operation, id responseObject) { 

               } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

                NSLog(@"Error : %ld", (long)error.code); 
               }]; 

     operation.outputStream = [NSOutputStream outputStreamToFileAtPath:destinationPath append:NO]; 

     [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 
      float percentage = (float) (totalBytesRead * 100)/totalBytesExpectedToRead; 
      [self.delegate downloadProgression:percentage]; 
     }]; 

     [operationQueue addOperation:operation]; 
    } 
} 

Пожалуйста, помогите.

ответ

3

Когда вы позвоните GET, оно уже добавлено к operationQueueAFHTTPRequestionOperationManager. Поэтому не добавляйте его в очередь снова.

Кроме того, вы должны создать экземпляр AFHTTPRequestOperationManager один раз перед циклом, не повторяющийся в цикле.


Есть и другие проблемы с этим кодом, но вместо того, чтобы решить все эти вопросы, я предлагаю вам перейти к AFHTTPSessionManager, который использует NSURLSession. Старое AFHTTPRequestOperationManager было NSURLConnection-основано, но NSURLConnection теперь устарело. И, фактически, AFNetworking 3.0 полностью удалил AFHTTPRequestOperationManager.

Таким образом, AFHTTPSessionManager цветопередача может выглядеть следующим образом:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 

for (NSInteger i = 0; i < urlArray.count; i++) { 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlArray[i]]]; 
    NSURLSessionTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress) { 
     [self.delegate downloadProgression:downloadProgress.fractionCompleted * 100.0]; 
    } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
     return [NSURL fileURLWithPath:[self.documentDirectory getDownloadContentPath:contentPaths[i]]]; 
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
     NSLog(@"File downloaded to: %@", filePath); 
     NSLog(@"Error: %@" error.localizedDescription); 
    }]; 
    [task resume]; 
} 
+0

спасибо, но как реализовать прогрессию блок с NSURLSession? – Nuibb

+0

Как я могу сделать любую зависимость при загрузке с помощью этого блока NSURLSession? я имею в виду синхронизацию один за другим? – Nuibb

+0

Ya Я пытаюсь реализовать блок NSProgress. В вашем коде у меня появилась ошибка, например «Отправка» void (^) (NSProgress * __ strong) 'в параметр несовместимого типа «NSProgress» __ autoreleasing _Nullable * _Nullable ». Как это решить? И как собрать дочерний NSProgress в один мастер NSProgress? – Nuibb

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

  • Нет связанных вопросов^_^