Как показать ProgressBar с AFNetworking AFHTTPRequestOperationManager

Я пытаюсь показать индикатор выполнения, когда загружаю JSON с URL-адреса. JSON загружается правильно, но я не уверен, как показать индикатор выполнения. Я пытался использовать UIProgressView, но он не отображается на экране. Мы ценим любые предложения.

CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;

CGRect rect = CGRectMake(width/2, height/2, width/5, height/5);
UIProgressView *myProgressView = [[UIProgressView alloc]initWithFrame:rect];
myProgressView.progressViewStyle = UIProgressViewStyleBar;
[self.view addSubview:myProgressView];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];    
[manager GET:@"https:urlWithJson" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
      [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
       {
           myProgressView.progress = (float)totalBytesRead / totalBytesExpectedToRead;
       }];
      [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@"operation Completed");
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
          NSLog(@"ERROR");
      }];

      [operation start];
  } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      NSLog(@"timeout Error: %@", error);
  }];

person baskInEminence    schedule 28.06.2015    source источник
comment
Имеет ли значение totalBytesExpectedToRead? Заголовок HTTP должен содержать размер документа, чтобы получить общее ожидаемое количество байтов.   -  person Thomas    schedule 28.06.2015
comment
Я попытался ввести оператор NSLog внутри setDownloadProgressBlock, но он ничего не напечатал. Есть ли лучший способ добиться того, чего я хочу?   -  person baskInEminence    schedule 28.06.2015


Ответы (2)


Вы устанавливаете блок прогресса загрузки внутри блока успеха, что слишком поздно;)

Попробуй это:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];    
AFHTTPRequestOperation *operation = [manager GET:@"https:urlWithJson" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Complete");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

[operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    myProgressView.progress = (float)totalBytesRead / totalBytesExpectedToRead;
}];
person Thomas    schedule 28.06.2015

Простое решение для Swift:

let progress: UIProgressView? //for example, reference to IBOutlet
let manager = AFHTTPRequestOperationManager()
let operation = manager.POST(query, parameters: parameters, constructingBodyWithBlock: { multipartData in

             //do sth with your multipartData
    }, success: { operation, response in

            //success
    }) { operation, error in

            //failure
}

progress?.setProgressWithUploadProgressOfOperation(operation!, animated: true)

Вы больше ничего не делаете. Этого достаточно, чтобы показать прогресс на вашем взгляде.

person Bartłomiej Semańczyk    schedule 04.12.2015