使用AFDownloadRequestOperation下载队列中的多个文件

时间:2013-08-12 10:47:56

标签: ios download background-image afnetworking

我正在使用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];

2 个答案:

答案 0 :(得分:0)

您需要将操作添加到AFHTTPClient的operationQueue,或者将它们添加到您自己创建的NSOperationQueue中。

然后将您使用的队列的最大并发操作数设置为1

答案 1 :(得分:0)

更改

[operation start];

[[YourAFHTTPClientSubclass sharedInstance] enqueueHTTPRequestOperation:operation];

默认情况下,这将具有“由NSOperationQueue对象根据当前系统条件动态确定的最大操作数”。

如果你真的想一次强制一个,请执行:

[YourAFHTTPClientSubclass sharedInstance].operationQueue.maxConcurrentOperationCount = 1;

这将阻止所有网络操作,直到操作完成。

当然,您可以像Audun建议的那样建立自己的操作队列,但最好让系统根据当前条件决定做什么。

根据您的使用情况,您可能希望将视频下载操作的优先级设置为低:

operation.queuePriority = NSOperationQueuePriorityLow

这将允许其他网络操作以比视频下载更高的优先级放入队列。