使用 afnetworking 一次下载一个文件

Posted

技术标签:

【中文标题】使用 afnetworking 一次下载一个文件【英文标题】:Download one file at a time using afnetworking 【发布时间】:2016-06-21 10:01:00 【问题描述】:

我有一个 array,其中包含不同的 URL。我想下载一个带有进度条的文件,然后开始下一个文件,依此类推。

这是我到目前为止的代码;

-(void) func:(NSArray *) arry


    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    configuration.timeoutIntervalForRequest = 900;
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

    NSMutableArray * downloadedUrl = [[NSMutableArray alloc] init];
    for (NSString * str in arry) 
        NSURL *URL = [NSURL URLWithString:str];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];

        NSURLSessionDownloadTask downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL (NSURL targetPath, NSURLResponse response) 
             NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];

             return [tmpDirURL URLByAppendingPathComponent:[response suggestedFilename]];
         completionHandler:^(NSURLResponse response, NSURL filePath, NSError *error) 

            if(error)
            
                NSLog(@"File Not Dowloaded %@",error);

            

        ];
        [downloadTask resume];
    

如何使用进度条一次下载一个文件,然后从数组中删除 url?

【问题讨论】:

【参考方案1】:

声明一个全局文件NSMutableArray,并在如下函数中使用。

-(void) downloadFile 

     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
     configuration.timeoutIntervalForRequest = 900;
     AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

     NSURL *URL = [NSURL URLWithString:[self.fileArr firstObject]]; //Here self.fileArr is your global mutable array
     NSURLRequest *request = [NSURLRequest requestWithURL:URL];

     NSURLSessionDownloadTask downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL (NSURL targetPath, NSURLResponse response) 
     NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];

        return [tmpDirURL URLByAppendingPathComponent:[response suggestedFilename]];
      completionHandler:^(NSURLResponse response, NSURL filePath, NSError *error) 

        if(error)
        
            NSLog(@"File Not Dowloaded %@",error);
            [self downloadFile];
        
        else 
            [self.fileArr removeObjectAtIndex:0];
            if (self.fileArr.count > 0) 
                [self downloadFile];
            
        
    ];
    [downloadTask resume];

现在调用此函数,但在此之前 initialize self.fileArr 和之后调用 downloadFile 方法。

希望这会对你有所帮助。

【讨论】:

即使文件下载失败,您也应该继续处理下一次下载并处理失败的情况。 如何计算进度。? @NiravDoctorwala @salmancs43 使用分段下载或假设进度。 @salmancs43 你试试这个答案***.com/questions/19145093/…【参考方案2】:

一次将队列限制为一个操作,

为此,请在排队之前尝试在每个操作之间添加依赖关系。

如果您在添加到队列之前添加两个操作之间的依赖关系,例如 operation1 和 operation2,则 operation2 将在 operation1 完成或取消之前启动。

这样做:

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

// Make operation2 depend on operation1

[operation2 addDependency:operation1];

[operationQueue addOperations:@[operation1, operation2, operation3] waitUntilFinished:NO];

更新

// Create a http operation

NSURL *url = [NSURL URLWithString:@"http://yoururl"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 

    // Print the response body in text

    NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

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

    NSLog(@"Error: %@", error);

];

// Add the operation to a queue
// It will start once added

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:operation];

希望对您有所帮助..!

【讨论】:

如果你有这方面的教程,请参考。我是第一次使用 AFNetworking

以上是关于使用 afnetworking 一次下载一个文件的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发-AFNetworking封装Get(自定义HTTP Header)和Post请求及文件下载

iOS - 使用 AFNetworking 获取图像保持缓存

使用 AFNetworking 下载文件

iOS开发网络数据之AFNetworking使用

使用 AFNetworking 下载大文件

在 iOS 6 上使用 AFNetworking 下载文件