菜鸟教程小白 发表于 2022-12-12 22:32:22

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


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

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

<p>我尝试使用 <code>NSOperationQueue</code> 并设置 <code>setMaxConcurrentOperationCount</code>,所有代码块一次执行。 :(</p>

<p>我觉得它可能可以使用 <code>AppDelegate</code> 中的 <code>AWSServiceConfiguration</code> 进行配置,但文档对于您可以传递给该对象的变量非常模糊... <a href="http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSServiceConfiguration.html" rel="noreferrer noopener nofollow">http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSServiceConfiguration.html</a> </p>

<p>有人有这方面的经验吗?</p>

<p>TIA</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您的问题很可能是您误解了异步操作的方法。 </p>

<blockquote>
<p>I have tried using an NSOperationQueue and setting
setMaxConcurrentOperationCount, and all the code blocks execute at
once. :(</p>
</blockquote>

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

<ol>
<li>你创建 <code>NSOperationQueue</code></li>
<li>例如,您将 <code>maxConcurrentOperationsCount</code> 设置为 <code>2</code></li>
<li>您使用 <code>AWSContent downloadWithDownloadType:</code></li> 向其中添加 4 个 block
<li>您不希望同时运行 2 次下载</li>
</ol>

<h1>你可能做错了什么</h1>

<p>关键在第 3 点里面。这个 block 到底是做什么的?我的猜测是它在实际下载完成之前完成。所以如果你有类似的东西:</p>

<pre><code>NSOperationQueue *queue = ;
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
      }];
    }];
}
</code></pre>

<p>您的 block 退出<strong>在</strong>您的下载完成之前,允许下一个 block 在队列中运行并开始进一步的下载。</p>

<h1>尝试什么</h1>

<p>您应该简单地向您的 block 添加一些同步机制,让操作仅在完成 block 上完成。说:</p>

<pre><code>NSOperationQueue *queue = ;
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&#39;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
    }];
}
</code></pre>

<p>实际上你的答案是<a href="https://stackoverflow.com/a/4326754/2392973" rel="noreferrer noopener nofollow">https://stackoverflow.com/a/4326754/2392973</a> </p>

<p>您只需将大量此类 block 安排到您的操作队列中。</p>

<h1>更多阅读</h1>

<p> <a href="https://developer.apple.com/reference/dispatch" rel="noreferrer noopener nofollow">https://developer.apple.com/reference/dispatch</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - AWS 开发工具包 - 为 CloudFront 下载实现网络队列,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40054061/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40054061/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - AWS 开发工具包 - 为 CloudFront 下载实现网络队列