0

私のアプリケーションでは、Songs(Mp3)ファイルを販売するためのアプリ購入で非消耗品を提供しています。現在、曲のリストを一覧表示しています。ユーザーが[購入]をタップすると、曲名と[ダウンロード]ボタンおよび[進行状況]ビューを含む別のuitableview([ダウンロード]画面のビュー)が表示されます。

ユーザーが曲を購入し続けると、それらの曲がuitableviewのダウンロード画面に追加されます。ユーザーがファイルをダウンロードできる場所。

現在、[ダウンロード]ボタンをタップするとファイルをダウンロードでき、ダウンロードの進行状況が表示されます。正常に動作しています。

ボタンをタップせずにサーバーからコンテンツのダウンロードを開始するにはどうすればよいですか。つまり、uitableviewcellの最初の行のダウンロードが完了したら、2番目の行のダウンロードを開始する必要があります。

私を導いてください、私は本当に私の問題への適切なリンク/参照を見つけることができません

4

2 に答える 2

0

曲のダウンロードをどのように実装したかわかりません。どのスレッドを使用していますか?ダウンロードは時間と負荷のかかる操作であり、非 UI スレッドで実行する必要があります。

あなたの説明から、たとえばNSOperation、曲のダウンロードNSOperationQueueを処理し、それらを処理するために使用するサブクラスを作成することをお勧めします。

許可する同時ダウンロード数NSOperationQueueを指定できます (デフォルトでは無制限)。その後、各操作で (またはデリゲートを介して) 通知を行い、ダウンロードの進行状況を提供できます。

  1. ユーザーがボタンをタップして曲を「購入」
  2. NSOperation曲のダウンロード用に作成
  3. 操作をに追加しますNSOperationQueue- 現在のコントローラーをデリゲートとして設定するか、通知をセットアップします
于 2012-08-09T06:39:54.167 に答える
0

再帰性とデリゲートを使用し、ダウンロードに使用するメソッドがそのデリゲートを呼び出すようにします。デリゲートはダウンロード メソッドを再度呼び出す必要があるため、次のアイテムがダウンロードされます。次に、すべてのアイテムがダウンロードされるまでこれを続け、フラグまたは何かを有効にして再帰を停止します。

考え:

これで、ユーザーがボタンを押すと 1 つの曲がダウンロードされます。

したがって、これの代わりに、 DownloadMethod に曲またはダウンロードしたいものを受け取るようにします。たとえば、配列にすることができます。

だから今

DownloadMethod(arrayToDownload)
{
    If (arrayToDownload is not empty)
    { 
        [SongsArray addElement: download song in the last position with your original method]
        [arrayToDownload removeLastLemenet]
       downloadmethod(arrayToDownload)
    }
}

これはよくできていない疑似コードですが、基本的な考え方です。これを委任なしで機能させるには、操作を同期的に実行する必要があることに注意してください。インターフェイスがたむろしないようにするには、たとえばバックグラウンドキューで実行することができます (ダウンロードが同期的に実行される限り)。

同期的に行うということは、このコードのすべての部分が前のコードの後に​​実行されることを確認することを意味します。ただし、グランド セントラル ディスパッチを使用して別のスレッドですべてのコードを実行し、UI がロックされないようにする必要があります。

参照: https://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

ガイド: https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

于 2012-08-09T06:30:08.087 に答える