使用 AFDownloadRequestOperation 下载队列中的多个文件
Posted
技术标签:
【中文标题】使用 AFDownloadRequestOperation 下载队列中的多个文件【英文标题】:Download multiple files in queue with AFDownloadRequestOperation 【发布时间】:2013-08-12 10:47:56 【问题描述】:我正在使用 AFDownloadRequestOperation + AFNetworking 从服务器下载和恢复文件列表。该代码非常适合一次下载和恢复多个文件。但是如何在一个操作队列中对所有操作进行排队并一个一个地执行呢?
这是我当前的代码
// request the video file from server
NSString *downloadURL = [NSString stringWithFormat:@"%@%@", [recipe download_url], [step valueForKey:@"video"]];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:downloadURL]];
AFDownloadRequestOperation *operation = [[AFDownloadRequestOperation alloc] initWithRequest:request targetPath:videoFile shouldResume:YES];
// done saving!
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Done downloading %@", videoFile);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %ld", (long)[error code]);
];
// set the progress
[operation setProgressiveDownloadProgressBlock:^(AFDownloadRequestOperation *operation, NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile)
float progress = ((float)totalBytesReadForFile) / totalBytesExpectedToReadForFile;
[progressBar setProgress:progress];
];
[operation start];
【问题讨论】:
【参考方案1】:您需要将操作添加到 AFHTTPClient 的 operationQueue,或者将它们添加到您自己创建的 NSOperationQueue。
然后将您使用的队列的最大并发操作数设置为 1
【讨论】:
【参考方案2】:改变
[operation start];
到
[[YourAFHTTPClientSubclass sharedInstance] enqueueHTTPRequestOperation:operation];
默认情况下,这将具有“由 NSOperationQueue 对象根据当前系统条件动态确定”的最大操作数。
如果您真的想一次将所有内容强制为一个,请执行以下操作:
[YourAFHTTPClientSubclass sharedInstance].operationQueue.maxConcurrentOperationCount = 1;
这将阻止所有网络操作,直到操作完成。
当然,你可以按照 Audun 的建议,制作自己的操作队列,但最好还是让系统根据当前情况决定做什么。
根据您的用例,您可能希望将视频下载操作的优先级设置为低:
operation.queuePriority = NSOperationQueuePriorityLow
这将允许其他网络操作以比您的视频下载更高的优先级放入队列中。
【讨论】:
以上是关于使用 AFDownloadRequestOperation 下载队列中的多个文件的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)