2

現在、AWS SDKを使用して大きなメディアファイルをデバイスにダウンロードするiOSプロジェクトに取り組んでいます。コンテンツを配布するのにCloudFrontを使用していますが、ダウンロードはうまくいきますが、これらの操作のネットワークキューを実装する際に問題が発生しています。私が試しても、すべてのファイルは一度にダウンロードしたい。AWS SDK - CloudFrontのダウンロード用のネットワークキューを実装する

私はAWSContent downloadWithDownloadType:メソッドを使用して、実際のダウンロードの進捗状況を監視しています。

NSOperationQueueを使用し、setMaxConcurrentOperationCountを設定しようとしましたが、すべてのコードブロックが一度に実行されました。 :(

私はそれがAppDelegateAWSServiceConfigurationで設定可能であるかもしれない感情を持っていますが、ドキュメントが

http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSServiceConfiguration.htmlはこれでどんな経験をした誰もが...あなたは、そのオブジェクトに渡すことができるものの変数に非常に曖昧です?

TIA

答えて

2

あなたの問題は、非同期操作のアプローチを誤解可能性が最も高い。

NSOperationQueueを使用し、 setMaxConcurrentOperationCountを設定しようとしましたが、すべてのコードブロックは で一度だけ実行されます。 :(

しかし、実際のコードを見ることなく、間違いなく間違っているものを言って、それが次のステップに結びついの最も可能性の高いことは困難です:あなたは、たとえば2maxConcurrentOperationsCountを設定NSOperationQueue

  • 作成

    1. あなたはそれに4ブロックを追加しますAWSContent downloadWithDownloadType:
    2. 同時に実行される2つのダウンロードを期待します

    あなたはおそらく

    キーポイントを正確にブロックが何3の内部にある間違った何をしますか?私の推測では、実際のダウンロードが完了する前に完了しています。だから、のようなものがある場合:

    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 
         }]; 
        }]; 
    } 
    

    あなたのブロックを終了、あなたのダウンロードが次のブロックがキュー上で実行することができ、さらに、ダウンロードを開始し、終了する前を。あなたは、単にだけ完了ブロック上の操作が完了できるように、あなたのブロックにいくつかの同期メカニズムを追加する必要がありますどのような

    をしようとする

    。セイ:あなたは自分の操作キューにそのようなブロックの多くをスケジュールhttps://stackoverflow.com/a/4326754/2392973

    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://developer.apple.com/reference/dispatch

  • +0

    私はワークショップこの今夜よ、あなたの入力に感謝:)私は感謝の男、探していたまさに – Chris

    +0

    !さらに読んでいただけるリンクをありがとうございました.D – Chris

    +0

    np男の子、私が助けることができてうれしいです:) –

    関連する問題