使用 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请求及文件下载