我目前正在开发一个利用 AWS 开发工具包将大型媒体文件下载到设备的 iOS 项目。我正在使用 CloudFront
分发内容并且下载运行良好,但是我在为这些操作实现网络队列时遇到问题。无论我尝试什么,所有文件都想一次下载。
我正在使用 AWSContent downloadWithDownloadType:
方法来启动和监控实际下载的进度。
我尝试使用 NSOperationQueue
并设置 setMaxConcurrentOperationCount
,所有代码块一次执行。
我觉得它可能可以使用 AppDelegate
中的 AWSServiceConfiguration
进行配置,但文档对于您可以传递给该对象的变量非常模糊... http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSServiceConfiguration.html
有人有这方面的经验吗?
TIA
您的问题很可能是您误解了异步操作的方法。
I have tried using an NSOperationQueue and setting setMaxConcurrentOperationCount, and all the code blocks execute at once.
如果没有看到实际代码,很难说出肯定有什么问题,但很可能与以下步骤有关:
NSOperationQueue
maxConcurrentOperationsCount
设置为 2
AWSContent downloadWithDownloadType:
关键在第 3 点里面。这个 block 到底是做什么的?我的猜测是它在实际下载完成之前完成。所以如果你有类似的东西:
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationsCount = 2;
for (AWSContent *content in contentArray) { // Assume you already do have this array
[queue addOperationWithBlock:^() {
[content downloadWithDownloadType:AWSContentDownloadTypeIfNotCached
pinOnCompletion:YES
progressBlock:nil
completionHandler:^(AWSContent *content, NSData *data, NSError *error) {
// do some stuff here on completion
}];
}];
}
您的 block 退出在您的下载完成之前,允许下一个 block 在队列中运行并开始进一步的下载。
您应该简单地向您的 block 添加一些同步机制,让操作仅在完成 block 上完成。说:
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationsCount = 2;
for (AWSContent *content in contentArray) { // Assume you already do have this array
[queue addOperationWithBlock:^() {
dispatch_semaphore_t dsema = dispatch_semaphore_create(0);
[content downloadWithDownloadType:AWSContentDownloadTypeIfNotCached
pinOnCompletion:YES
progressBlock:nil
completionHandler:^(AWSContent *content, NSData *data, NSError *error) {
// do some stuff here on completion
// ...
dispatch_semaphore_signal(dsema); // it's important to call this function in both error and success cases of download to free the block from queue
}];
dispatch_semaphore_wait(dsema, DISPATCH_TIME_FOREVER); // or another dispatch_time if you want your custom timeout instead of AWS
}];
}
实际上你的答案是https://stackoverflow.com/a/4326754/2392973
您只需将大量此类 block 安排到您的操作队列中。
https://developer.apple.com/reference/dispatch
关于ios - AWS 开发工具包 - 为 CloudFront 下载实现网络队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054061/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |