ios - 使用AFNetworking计算下载多个文件的总进度

标签 ios objective-c download afnetworking

我想下载多个文件,然后向用户显示总进度。

但是问题来了,我不知道应该怎么计算总进度。

这是我的做法: 首先我得到 totalBytes Expected to receive from all the files:

for (NSURL candidateUrl in UrlsList)
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:candidateURL];
                        //setting HTTPMethod of request from GET to HEAD to download header files of requests, so we can get file size before downloaing file
                        [request setHTTPMethod:@"HEAD"];

                        getTotalImagesBytesOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
                        [getTotalImagesBytesOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
                         {
                             //setting totalImagesBytesExpectedToRead of all images. we use it to know how many bytes we should download for all the images
                              totalImagesBytesExpectedToRead += [operation.response expectedContentLength];


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

                        [operationQueue addOperation:getTotalImagesBytesOperation];
}

在估计总文件大小之后:

        //downloading images
    for (NSURL *imageUrl in imagesURLList) {
        NSURLRequest *request = [NSURLRequest requestWithURL:imageUrl];
        AFImageRequestOperation *downloadImageOperation = [AFImageRequestOperation imageRequestOperationWithRequest:request
                                                                                  imageProcessingBlock:nil

                                                                                               success: ^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {                                                                                      
NSLog(@"success")
}
failure: ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                                                                                                       NSLog(@"%@", [error localizedDescription]);
                                                                                                   }];

        [operationQueue addOperation:downloadImageOperation];

        [downloadImageOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
        {

          **HOW TO CALCULATE TOTAL PROGRESS**
}

我不知道如何计算总大小!! 我们的值(value)观: 上述方法为您提供的当前文件的 totalBytesOfAllTheFiles、totalBytesRead 和 totalBytesExpectedToRead、indexOfCurrentFile 和 countOfFiles。

小心 setDownloadProgressBlock 一次调用数百个。

有人知道吗? (抱歉代码格式不正确!)

最佳答案

我是这样实现的: 首先创建一个 NSOperationQueue:

// Add the operation to a queue
// It will start once added
//calculating images byte size
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:1];
foreach (NSURL *candidateURL in urlList )
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:candidateURL];
                    //setting HTTPMethod of request from GET to HEAD to download header files of requests, so we can get file size before downloaing file
                    [request setHTTPMethod:@"HEAD"];

                    AFHTTPRequestOperation *getTotalImagesBytesOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
                    [getTotalImagesBytesOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
                     {
                         //setting totalImagesBytesExpectedToRead of all images. we use it to know how many bytes we should download for all the images
                         totalImagesBytesExpectedToRead += [operation.response expectedContentLength];


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

                    [operationQueue addOperation:getTotalImagesBytesOperation];
}

 //downloading images which should be downloaded
for (NSURL *imageUrl in imagesShouldBeDownlaoded) {
    NSURLRequest *request = [NSURLRequest requestWithURL:imageUrl];

    AFHTTPRequestOperation *downloadFileOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    //we must provide file path with file name and its extension
    NSString *fileName = [self getImageName:[imageUrl absoluteString]];
    downloadFileOperation.outputStream = [NSOutputStream outputStreamToFileAtPath:[[ImageManager applicationDocumentsDirectory] stringByAppendingPathComponent:fileName] append:NO];

    [downloadFileOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation , id response)
     {
         NSLog(@"file saved");

     }failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
         completionBlock(NO, error);
         NSLog(@"%@", [error localizedDescription]);
     }];

    [operationQueue addOperation:downloadFileOperation];

    [downloadFileOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
     {
         totalBytesDownloaded += bytesRead;

         //total progress from 0.0 to 1.0
         progress = ((float)totalBytesDownloaded/(float)totalImagesBytesExpectedToRead);
         if(progress == 1)
         {
             completionBlock(YES, nil);
         }
         progressCallback(progress);
    }];

operationQueue作为一个FIFO列表,先计算图片字节大小,然后开始下载所有图片

关于ios - 使用AFNetworking计算下载多个文件的总进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25710949/

相关文章:

ios - 在表格 View 单元格中检索数组的值swift ios

objective-c - 消除 NSString 中垃圾值的出现?

ios - 将 UIMotionEffect 与 OpenGL ES 一起使用

python - 如何正确安装 wxPython?

c# - 使用c#从sql服务器下载文件

javascript - 包含 JS 文件的替代方法

ios - 我不断收到 : fatal error: Index out of range

ios - 到达 UITableView 底部后加载更多

ios - 在 Swift 中将 UInt32 (UTF-32) 转换为字符串

iphone - MapView注解indexPath?