• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - AWS 开发工具包 - 为 CloudFront 下载实现网络队列

[复制链接]
菜鸟教程小白 发表于 2022-12-12 22:32:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我目前正在开发一个利用 AWS 开发工具包将大型媒体文件下载到设备的 iOS 项目。我正在使用 CloudFront 分发内容并且下载运行良好,但是我在为这些操作实现网络队列时遇到问题。无论我尝试什么,所有文件都想一次下载。

我正在使用 AWSContent downloadWithDownloadType: 方法来启动和监控实际下载的进度。

我尝试使用 NSOperationQueue 并设置 setMaxConcurrentOperationCount,所有代码块一次执行。

我觉得它可能可以使用 AppDelegate 中的 AWSServiceConfiguration 进行配置,但文档对于您可以传递给该对象的变量非常模糊... http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSServiceConfiguration.html

有人有这方面的经验吗?

TIA



Best Answer-推荐答案


您的问题很可能是您误解了异步操作的方法。

I have tried using an NSOperationQueue and setting setMaxConcurrentOperationCount, and all the code blocks execute at once.

如果没有看到实际代码,很难说出肯定有什么问题,但很可能与以下步骤有关:

  1. 你创建 NSOperationQueue
  2. 例如,您将 maxConcurrentOperationsCount 设置为 2
  3. 您使用 AWSContent downloadWithDownloadType:
  4. 向其中添加 4 个 block
  5. 您不希望同时运行 2 次下载

你可能做错了什么

关键在第 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap