2011-10-17 7 views
2

私のアプリでは、Webサービスを呼び出してオブジェクトの配列に解析されるJSONを取得しています。時間のかかる部分は間違いなくWebサービスコールです。次のように私が望む動作は次のとおりです。UIActivityIndi​​catorを持つUIAlertViewが遅すぎる/スレッドの問題を表示します

  1. ユーザーは、現在のビューに関心
  2. の行を選択し、ActivtiyIndi​​catorのサブビューを持つAlertViewは新しいVCに
  3. データのロードを追加
  4. 新しいビューが
  5. AVインジケーターを表示されます行った

私のVCには、基本的に表示されるデータの配列をロードするdoLoadDataメソッドが装備されています各VCによって。たとえば:

AnimalViewControllerは、ボタンを押すときないこと「ビュー犬」を持っている:

DogViewController *vc = [[DogViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
[vc release];

DogViewControllerが財産NSArray *dogsてしばらくが起こることを取る方法doLoadDogsを、持っています。

現在、私は、 "ビュー犬" の方法にしている:

  1. ActivityIndi​​cator
  2. とAlertViewの作成は
  3. それを表示すること
  4. がAlertView
  5. を隠すプッシュVC
  6. を作成します。
  7. リリースしていません。

これは難しいことではないようですが、私はまだこれをスレッド化して簡単に実装しています。

答えて

1

ネットワークコール/アレイの作成に時間がかかり、メインスレッド上にある場合、これらはすべて本質的に同時に発生します。アラートビューを表示する、ナビゲーションコントローラをプッシュするなどの操作を行うときは、実際に実行していることは、実行ループの次のターンに発生するようにこれらの処理をスケジュールすることです。あなたの "View Dogs"メソッドはすべてが完了するまで本質的にブロックするので、実行ループはすべてが必要になるまで再び実行されません。

ベストの解決策は、ネットワーク負荷コードを除外し、メインスレッド/メインイベントループをブロックしないことです。簡単な修正として、GCDを使って現在の "View Dogs"メソッドの要素を除外することができます。いくつかのことを改善し

- (void)viewDogs:(id)sender 
{ 
    dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
    // create and schedule the alert view 
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle...]; // your real alert view 
    dispatch_async(mainQueue, ^{ [alert show]; }); 
    dispatch_async(mainQueue, ^{ 
    DogViewController* vc = [[DogViewController alloc] init]; 
    [[self navigationController] pushViewController:vc animated:YES]; 
    [vc release]; 
    dispatch_async(mainQueue, ^{ [alert dismissWith...]; [alert release]; }); 
    }); 
} 
+0

この(上記のコードブロック)が、今何が起こるかです::例として(当然これはあなたの実際の要件/コードに更新する必要があります)viewDogsは、と呼ばれる一時停止、新しい画面を(とデータとアクティビティインジケータ)が表示され、アクティビティインジケータが消え、黒いコーナーが消えます。私は何が起こりたいのですか:viewDogsが呼び出され、loadDogsが終了するまでその画面にアクティビティインジケータが表示され、新しいスクリーンが表示されます。 –

+0

@ jshin47うん、それは良くありません。最も良いことは、読み込みコードを除外して、ブロックされず、終了時に何らかの方法で通知することです。 GCDを使ってこれを行うのは比較的簡単ですが、1つの方法ですべてをやりたいとは思わないでしょう。 –

+0

@JasonCocoなぜ、別のスレッドでperformselectorの代わりにdispatch_asyncを使用するのですか? –

関連する問題