2

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

2 回答 2

0

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

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

于 2013-08-12T10:55:49.733 回答
0

改变

[operation start];

[[YourAFHTTPClientSubclass sharedInstance] enqueueHTTPRequestOperation:operation];

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

如果您真的想一次将所有内容强制为一个,请执行以下操作:

[YourAFHTTPClientSubclass sharedInstance].operationQueue.maxConcurrentOperationCount = 1;

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

当然,您可以按照 Audun 的建议制作自己的操作队列,但最好让系统根据当前情况决定要做什么。

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

operation.queuePriority = NSOperationQueuePriorityLow

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

于 2013-08-12T19:38:15.087 回答