2011-06-28 4 views
0

私は、非同期ダウンロードの処理方法や実際には一連のイベントを持つプログラムに関する基本的なアーキテクチャ上の質問があり、以前のイベントが終了するまで各イベントが開始されません。iphone Asynch複数のプロセスをダウンロードして処理する

データをダウンロードしてからダウンロードが完了した後でアクションを実行する場合は、その間に(進捗インジケータ、スプラッシュ画面などを表示するなど)何か他の操作を行いたい場合は、そのようなプログラムを設計することは意味:

-(void)thisMethodStartsTheDownloading{ 
     //start the download using NSURLConnection (I'm fine with these details) 

     //show a UIView for a splash screen image or do anything else you want to do 
} 


-(void)thisMethodRunsWhenDownloadIsFinished{ 
     //hide or remove the splash screen (if applicable) 
     //do whatever I need to do with the downloaded data 
     //this method does not run on its own unless called when NSURLConnection is done 
    } 


    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
     //do whatever I need to do with my downloaded data 

    [self performSelector:@selector(thisMethodRunsWhenDownloadIsFinished)]; 
     // or [self thisMethodRunsWhenDownloadIsFinished]; 
    } 

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
     //incrementally appendData as it comes in from the download process 
      [receivedData appendData:data]; 
    } 

私は、各メソッドが完了するなどの方法の間の周りにジャンプし、プログラムの構造を理解していることを確認します。

基本的に、私はあなたがプロセスのチェーンを持っているが、前のチェーンが終了しない限り、そのチェーンの各部分が動くことができないと仮定します。現在のチェーンが終了したときにチェーン内の次のチェーンを呼び出すことによって、それらのチェーンを互いに向けることができます。これは理想的な/標準的な方法ですか?

答えて

1

はい:

は、上のstandarのLIBSを使用して行われている方法で見てみましょう。

プログラムを設計する標準的で堅牢な方法は、すべてのコードをイベントへの応答として整理することです。あなたの用語(「一連のプロセス」)はわかりませんが、これがシーケンスやスクリプト(イベントのやり方など)をイベントベースの環境に変換する方法であるかどうか聞いているようです。

実際には、ネットワークからデータが届かない場合や、データがすべて届かない場合や、時間がかかる場合があります。だから、多段階プロセスの一歩として「データをダウンロードする」と考えると、実際のアプリが扱う必要がある多くの問題が隠されています。

あなたのステップバイステップのプロセスが、この場合には:

  1. 表示プログレスバー
  2. スタートダウンロード
  3. ループ:プログレスバーを更新し、データを取得
  4. 隠すプログレスバー
  5. ドゥデータのあるもの

はい、あなたはそれをイベントに変換します。反応:

  • アプリが起動終了:
  • まずデータが到着し、ダウンロード開始し、プログレスバーを表示:ゼロ
  • より多くのデータに初期化するバッファ、設定プログレスバーに到着:バッファリングするために追加、更新プログレスバー
  • 接続が壊れていた:タップディスプレイの警告(キャンセル、再試行してください)
  • ユーザーは、再度お試し:
  • ダウンロードを開始タップユーザーがキャンセル:何か他
  • を示し、プログレスバーを削除します
  • ダウンロードが完了している:最初の方法は、物語として従うことが容易である一方で第二の方法は、例えば(取り扱い上の問題とエッジケースのより良い仕事をして、

を行い、プログレスバーを非表示に何か他のもの、 HTTPリダイレクトにより、「最初のデータ到着」イベントが2回起こります。

+0

助けてくれてありがとう – johnbakers

1

https://github.com/jdg/MBProgressHUDをご覧ください。

あなたは正しいアイデアがあります。 UINavigationControllerをどのように動作させるか、同様に各呼び出しを次の呼び出しに単純に連鎖させます。

http://allseeing-i.com/ASIHTTPRequest/のようなMBProgressHUDを使用すると、この種のタスクに必要なほとんどのものが得られます。

https://github.com/jdg/MBProgressHUD/blob/master/Demo/Classes/HudDemoViewController.m

+0

これらの便利なリンクに感謝します。 – johnbakers

関連する問題