我正在使用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];
答案 0 :(得分:0)
您需要将操作添加到AFHTTPClient的operationQueue,或者将它们添加到您自己创建的NSOperationQueue中。
然后将您使用的队列的最大并发操作数设置为1
答案 1 :(得分:0)
更改
[operation start];
到
[[YourAFHTTPClientSubclass sharedInstance] enqueueHTTPRequestOperation:operation];
默认情况下,这将具有“由NSOperationQueue对象根据当前系统条件动态确定的最大操作数”。
如果你真的想一次强制一个,请执行:
[YourAFHTTPClientSubclass sharedInstance].operationQueue.maxConcurrentOperationCount = 1;
这将阻止所有网络操作,直到操作完成。
当然,您可以像Audun建议的那样建立自己的操作队列,但最好让系统根据当前条件决定做什么。
根据您的使用情况,您可能希望将视频下载操作的优先级设置为低:
operation.queuePriority = NSOperationQueuePriorityLow
这将允许其他网络操作以比视频下载更高的优先级放入队列。