2011-08-30 7 views
8

私はtabviewアプリケーションを持っています。最初のタブにはwebViewがあります。ユーザーがウェブサイトを開いていくつかのソングmp3形式をダウンロードすると、 。tabBarアプリケーションで複数の曲をダウンロードする際の問題

タイトルを与えた後、私はちょうど曲 の1つのタイトルにtabbarSelectControllerを変更し、ダウンロードが開始され、選択したインデックス1のタブバーに表示されます。選択したインデックス0にタブを変更し、最初のダウンロード停止と2回目のダウンロード再開をselectedIndex 1に戻します。

ので、私は複数の曲をダウンロードしたいとユーザーが曲を追加するので、このシナリオでは、動的に私もASINtworkQueueを見てきましたが、それは

答えて

1
をどのように動作するかのアイデアを取得しないことを行うにはどのくらいのアイデアを持っていません

ASINetworkQueueNSOperationQueueのサブクラスで、リクエストオブジェクトのキューを作成します。たとえば、リクエストが10回、リクエストが完了したときに5回、リクエストが完了したときに5回、キューがアクティブになります。

リクエストのキューを持つことは確かに役に立ちますが、リクエストをどのように処理しているかについては、コードを貼り付けていません。だから、どうすればいいのかという一般的な概念をあなたに教えてくれるでしょう:

まず、あなたがすでに曲をダウンロードするときを特定する方法を理解していると仮定しています。ファイルのURL。そうでない場合、here's another question related。また、have ASI installed。私はあなたが、単一のダウンロードキューで作業していることを想像するので、私はこのクラスはシングルトン(based on this answer)のように振る舞うようになります

#import "ASINetworkQueue.h" 
#import "ASIHTTPRequest.h" 

@interface DownloadManager : NSObject <ASIHTTPRequestDelegate> 
{ 
    ASINetworkQueue *requestQueue; 
} 

+ (DownloadManager*)sharedInstance; 
- (void)addDownloadRequest:(NSString*)URLString; 

さんが言う、ダウンロードを扱うオブジェクト、DownloadManagerを追加してみましょう。そうでない場合は、あなたのニーズに適合させる:

DownloadManager *manager = [DownloadManager sharedInstance]; 
[manager addDownloadRequest:MyUrl]; 

を最初のタブにはアイテムを追加します。すべてのことを行うと

@implementation DownloadManager 

static DownloadManager *_shared_instance_download_manager = nil; 

+ (DownloadManager*)sharedInstance 
{ 
    @synchronize 
    { 
     if (!_shared_instance_download_manager) 
     { 
      _shared_instance_download_manager = [[DownloadManager alloc] init]; 
     } 

     return _shared_instance_download_manager 
    } 
} 

- (id)init 
{ 
    self = [super init]; 

    if (self) 
    { 
     requestQueue = [[ASINetworkQueue alloc] init]; 
     requestQueue.maxConcurrentOperationCount = 2; 
     requestQueue.shouldCancelAllRequestsOnFailure = NO; 
    } 

    return self; 
} 

- (void)addDownloadRequest:(NSString*)URLString 
{ 
    NSURL *url = [NSURL URLWithString:URLString]; 

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    request.delegate = self; 

    [requestQueue addOperation:request]; 
    [requestQueue go]; 
} 

- (void)requestFinished:(ASIHTTPRequest*)request 
{ 
    // Request finished. 
} 

- (void)dealloc 
{ 
    [requestQueue release]; 

    [super dealloc]; 
} 

@end 

を、今、あなたは、単にやってダウンロード要求を追加することができますDownloadManagerには、ダウンロードが完了したとき、または現在のステータスを他のタブで確認する必要があります。私はそれをコードに追加しませんでした。これは、これらのことをどのように行うかに依存しています。それはカスタムデリゲートメソッド(- (void)DownloadManager:(DownloadManager*)downloadManager didFinishDownloadRequest:(ASIHTTPRequest*)request)、またはリクエストの現在の代理人を渡すか、NSNotificationCenterを使用することができます。

+0

いいえ、私たちはprogressbarの進捗状況をどのように表示するのですか?ユーザーが一度に1つのリクエストを追加してダウンロードプロセスに入り、別のリクエストが追加された場合はどうなりますか? – dark

+0

あなたはバックグラウンドスレッドでsonggsをダウンロードできます。もし別のものが来たら、それを待ち行列に入れる必要があります。最初のものもnsoperationを使って完了するまで...... ......そうすれば、操作をシリアライズする必要があります。 –

+0

@lak in Iphoneそれのいくつかのチュートリアルのリンク? – dark

1

私はそれを別の方法を提案します。..

は、異なるクラスの曲のダウンロードのためのコードを入れてみてください。 Iphone O.S.そのクラスの各オブジェクトの新しい接続が自動的に開始されます。両方のダウンロードを同時に続けることができます。

美しく機能します。見たことあります。

関連する問題