2011-08-09 15 views
1

ファイルをダウンロードしてオフラインで見ることができるiPadアプリを作っています。バックグラウンドスレッドで複数のファイルをダウンロード

私はすでにビューの部分を持っており、ドキュメントディレクトリにファイルをダウンロードできます。 これで、移動を続けるためにダウンロードが完了するのを待つ必要があります。 これはスレッドに入れることで解決できますが、ユーザーが複数のファイルをダウンロードしたり、同じファイルを何度もダウンロードしたりするとどうなりますか?

私の考えは、進捗状況を見るためのダウンロードキューを作ることです。

ワークフロー:

  • ユーザーがドキュメントを押し、ダウンロードを開き、ユーザーは、ダウンロードが開始されたというメッセージを取得し、オフラインドキュメントビューで表示することができます。

  • ユーザーはさらに3つのドキュメントをダウンロードします。

  • ユーザーがオフラインドキュメントビューに移動すると、ユーザーは4つの塗りつぶしたセルでテーブルビューを表示します。 2つのドキュメントがロードされ、2つのドキュメントがまだダウンロードされています。これは、テーブルビューのセルにダウンロード/ステータスバーが表示されているためです。

  • ダウンロードしたドキュメントは表示または削除できます。

  • 進行中のダウンロードは(まだ)視聴できませんが、キャンセルできます。

ダウンロードするURLを追加できるスレッドダウンロードクラスを作成します。クラスには、ドキュメントのダウンロードをキャンセルして削除するメソッドがありますが、進行状況を返すメソッドもあります。 可能であれば、クラスは同時にダウンロードを処理できます。

問題は、どこから始めたらいいのですか?

+0

Grand Central Dispatchを見てください。これは、バックグラウンド処理を行うより簡単で、より良い/よりクリーンな方法です。また、キューイングも無料で提供されます。 – cellcortex

+0

それはとても面白そうですね!私はCGDに関するいくつかの研究を行い、私の考えに合っています。 – Justin

答えて

3

NSURLConnectionは既に非同期です。あなたは、NSURLConnectionインスタンスを作成し、それをあなたのデータ構造に関連させ、それを持っているだけです。

ここでは、アイテムごとに1つのUIViewがあると仮定した例です。テーブルビューを使用する場合は、ビューインスタンスをカウントすることはできませんが、代わりにダウンロードをNSIndexPathなどと関連付けることができます。

@implementation MyDownloadView 
- (void)startDownload { 
    NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
    [req setHTTPMethod:@"GET"]; 
    // Set headers etc. if you need 
    [[[NSURLConnection alloc] initWithRequest:req delegate:self] autorelease]; 
    [req release]; 

    self.responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Alternatively, store to a file so you don't run out of memory 
    [self.responseData appendData:data]; 
} 
@end 

次に、他のNSURLConnectionデリゲートメソッドを実装して、必要な処理を行います。

+0

しかし、それはあなたが同じビューでそれを完了する必要があることを意味します。私は、別のクラスの魔女がダウンロードを担当して、オフラインドキュメントビューでそれらを管理できる場所を欲しがっています。 – Justin

+0

これは、ビュークラスではなく別のクラスにどのように配置するかを想像するのは難しいことではありません。 –

0

あなたが望むほとんどすべての機能を備えたオープンソースの例を書いています。ダウンロードをキャンセルすることは現在のところコードでのみ可能ですが、ボタンを追加するのはかなり簡単です。

私はダウンロードを管理するためにasi-http-requestを使用していますが、それらはUITableViewの代わりにグリッドビュー(AQGridView)で表示されますが、あなたはそのアイデアを得ると思います。

ダウンロードの進捗状況はKVOによって管理されます。

PSPDFDownload.mを参照してください。Download the full demo here

詳細情報:このデモでは、PSPDFKitを使用してPDFの表示を高速化しています。しかし、キオスクの例はまさにあなたが必要とするものであり、pdfの表示にはPSPDFKitを使う必要はありません。 AppleのQuickLookを使ったコード例もあります。

関連する問題