2011-08-11 10 views
1

私が取り組んでいるアプリケーション用のダウンロードマネージャ機能の構築に取り組んでいます。要件として、最大3つのパラレルダウンロードをサポートする必要があります。同じデリゲートオブジェクトを使用してこのフォーラムのコード例をいくつか見て、NSURLConnectionオブジェクトの複数のインスタンスを作成しました。このアプローチの欠点(私が思う、私は間違っているかもしれません)は、オブジェクトを委譲するすべてのコールバックが同じスレッド上で起こることです。これにより、パケットはスレッド上でキューに入れられます。私はここで何かを逃していますかiOSでの並列ダウンロード

NSInvocationQueueを実行し、別のスレッドで個別にダウンロードを開始するなど、この機能を実装する方法はありますか?このアプローチでは、ダウンロードごとに進行状況を追跡し、ダウンロードを一時停止/再開し、スレッド管理を複雑にします。

私は個々のスレッドで非同期要求を作成し、明らかな理由で同期接続を維持しないことを計画しています。また、100 MBを超える大容量ビデオファイルをダウンロードし、ファイルに直接保存します。私は、パケットがどのようにキューに入れられるかについて、私は少し不明であり、私はメモリが足りなくなったり、メモリが不足したり、メインスレッドが応答しなくなったりします。

すべてのポインタやヘルプは大歓迎です。

おかげ

答えて

5

Tommyが指摘しているように、データをダウンロードするためだけに別のスレッドを使用することは一般的にあまり効率的ではありません。また、メインスレッドでNSURLConnectionの非同期インターフェイスを使用する場合よりもメモリオーバーヘッドが高くなり、多くの制御が失われます(バックグラウンドスレッドで実行中の同期接続をキャンセルすることはできません)。

デリゲートのコールバックはすべてメインスレッドのキューに入れられますが、通常は、ダウンロードが完了するまでデータチャンクを連結するだけです。これは計算上非常に安価です。

データをダウンロードした後(サムネイル画像の作成、解析など)に計算コストの高いものを作成する場合は、ダウンロードが完了した後にその作業をGCDキューに簡単にディスパッチできます。そうすれば、ダウンロードプロセスのコントロールが失われたり、進行状況を簡単に表示したり、ダウンロードの実行をキャンセルすることはできませんが、メインスレッドをブロックすることはありません。

0

それは助ける - http://allseeing-i.com/ASIHTTPRequest/

を並列ダウンロードするためにあなたがASINetworkQueueを使用することができます。

+0

サイトからは、ライブラリはもはや維持されていないようです。 – Scorchio

1

スレッドやブロッキング接続を使用するのではなく、NSURLConnectionをデリゲートと非同期で使用することをお勧めします。同じスレッドで複数のNSURLConnectionsを使用すると、データはすべて同じスレッドで返されますが、問題はありません。あなたのコードがそれを絡み合わない限り、データは何らかの形で絡み合わず、ネットワークのパフォーマンスには影響しません。

単にデータを取得するプロセスのスレッドを起動することは、特に同じスレッドで複数のNSURLConnectionsを使用する場合よりも、バッテリの使用効率が低下します。

0

ASIHTTPRequestのようにHTTPクライアントライブラリを調べる必要があります。

ASIHTTPRequestキューを使用する同時リクエストを処理します。これにより、同時実行性を簡単に制限できます。ASIHttpRequestから借り例コード:

- (IBAction)grabURLInTheBackground:(id)sender 
{ 
    if (![self queue]) { 
     [self setQueue:[[[NSOperationQueue alloc] init] autorelease]]; 
    } 

    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request setDidFinishSelector:@selector(requestDone:)]; 
    [request setDidFailSelector:@selector(requestWentWrong:)]; 
    [[self queue] addOperation:request]; //queue is an NSOperationQueue 
} 

- (void)requestDone:(ASIHTTPRequest *)request 
{ 
    NSString *response = [request responseString]; 
} 

- (void)requestWentWrong:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
} 

は並行性を変更する[NSOperationQueue maxConcurrentOperationCount]を変更します。

+0

サイトからは、ライブラリはもはや維持されていないようです。 – Scorchio

関連する問題