Переключение на AFNetworking из ASIHTTPRequest - проблема с ASINetworkQueue - PullRequest
7 голосов
/ 09 ноября 2011

Я работаю над проблемой, когда мне нужно загрузить около 10 разных больших файлов в очереди, и мне нужно отобразить индикатор выполнения, показывающий состояние всей передачи.У меня это отлично работает с ASIHTTPRequest в iOS4, но я пытаюсь перейти на AFNetworking, поскольку ASIHTTPRequest имеет проблемы в iOS5 и больше не поддерживается.

Я знаю, что вы можете сообщать о ходе выполнения по отдельным запросам с использованием downloadProgressBlock AFHTTPRequestOperation, но я не могу найти способ сообщить об общем прогрессе нескольких запросов, которые будут выполнены в одном NSOperationQueue.

Есть предложения?Спасибо!

Ответы [ 3 ]

1 голос
/ 20 декабря 2011
[operation setUploadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
    NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];

Операция AFHTTPRequestOperation

0 голосов
/ 28 ноября 2011

Вы можете создать подкласс AFURLConnectionOperation, чтобы иметь 2 новых свойства: (NSInteger)totalBytesSent и (NSInteger)totalBytesExpectedToSend. Вы должны установить эти свойства в обратном вызове NSURLConnection так:

- (void)connection:(NSURLConnection *)__unused connection 
   didSendBodyData:(NSInteger)bytesWritten 
 totalBytesWritten:(NSInteger)totalBytesWritten 
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    [super connection: connection didSendBodyData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite];
    self.totalBytesSent = totalBytesWritten;
    self.totalBytesExpectedToSend = totalBytesExpectedToSend;
}

Ваш блок uploadProgress может выглядеть следующим образом:

……(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
    NSInteger queueTotalExpected = 0;
    NSInteger queueTotalSent     = 0;
    for (AFURLConnectionOperation *operation in self.operationQueue) {
        queueTotalExpected += operation.totalBytesExpectedToSend;
        queueTotalSent     += operation.totalBytesSent;
    }
    self.totalProgress = (double)queueTotalSent/(double)queueTotalExpected;
}];
0 голосов
/ 28 ноября 2011

Я бы попробовал создать подкласс UIProgressView с помощью подкласса, который отслеживает все различные элементы, которые вы смотрите, а затем имеет логику, которая суммирует прогресс их всех вместе.

Возможно, с таким кодом:

 @implementation customUIProgressView

-(void) updateItem:(int) itemNum ToPercent:(NSNumber *) percentDoneOnItem {
  [self.progressQueue  itemAtIndexPath:itemNum] = percentDoneOnItem;

  [self updateProgress];
}
-(void) updateProgress {
  float tempProgress = 0;
  for (int i=1; i <= [self.progressQueue count]; i++) {
    tempProgress += [[self.progressQueue  itemAtIndexPath:itemNum] floatValue];
  }
  self.progress = tempProgress / [self.progressQueue count];
}
...