gpt4 book ai didi

ios - AWS SDK - 为 CloudFront 下载实现网络队列

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:27:51 25 4
gpt4 key购买 nike

我目前正在开发一个 iOS 项目,该项目利用 AWS SDK 将大型媒体文件下载到设备。我正在使用 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. :(

如果没有看到实际的代码,很难说出什么是绝对错误的,但很可能与以下步骤有关:

  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 SDK - 为 CloudFront 下载实现网络队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com