AFNetworking - загрузка нескольких файлов + мониторинг через UIProgressView
Я пытаюсь изменить свой код из ASIHTTPRequest в AFNetworking. В настоящее время я хочу выбрать 10-15 различных URL-адресов HTTP (файлов) и загрузить их в папку документов.
С ASIHTTPRequest, который был довольно прост с помощью
[myQueue setDownloadProgressDelegate:myUIProgressView];
В AFNetworking я не могу понять, как это сделать. У меня есть следующий код, который загружает файлы, сохраняет их и уведомляет, когда файл загружается успешно, но я не могу создать индикатор выполнения для этой очереди с общим размером.
for (i=0; i<3; i++) {
NSString *urlpath = [NSString stringWithFormat:@"http://www.domain.com/file.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlpath]];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"testFile%i.zip",i]];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Successfully downloaded file to %@", path);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
NSLog(@"Sent %d of %d bytes, %@", totalBytesWritten, totalBytesExpectedToWrite, path);
}];
[myQueue addOperation:operation];
}
Ответы
Ответ 1
Я думаю, вам придется создать свой собственный UIProgressView, который я буду называть progressView для примера.
progressVu = [[UIProgressView alloc] initWithFrame:CGRectMake(x, y, width, height)];
[progressVu setProgressViewStyle: UIProgressViewStyleDefault];
Затем просто обновите индикатор выполнения:
[operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
float percentDone = ((float)((int)totalBytesWritten) / (float)((int)totalBytesExpectedToWrite));
progressView.progress = percentDone;
NSLog(@"Sent %d of %d bytes, %@", totalBytesWritten, totalBytesExpectedToWrite, path);
}];
Ответ 2
[operation setDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
float percentDone = ((float)((int)totalBytesRead) / (float)((int)totalBytesExpectedToRead));
progressView.progress = percentDone;
}];
Ответ 3
Представьте, что вы загружаете 200+ файлов таким образом, предполагая размер файла по 1 МБ каждый.
Что происходит, когда вы создаете такой набор запросов (с тайм-аутом по умолчанию 30 с)?
Сразу после 30 секунд вы будете подвергнуты бомбардировке ошибками таймаута.
Просто скажи,
Мартин