2011-12-29 5 views
2

私はかなり面倒な問題があります。私はブログのエントリ(RSSフィードから収集)を持つテーブルビューを持っています。ビューが読み込まれると、読み込み画面が-addSubview:を介してblogViewsビューに適用されます。そして、-viewDidAppear:で私はデータを読み込み始めます。これは、iOS 5シミュレータとiOS 5.0.1のiPhone 4で動作します。ViewDid iOS 4.3 vs iOS 5の場合、読み込み画面は4.3に表示されません

しかし、4.3シミュレータで実行すると、読み込み画面が表示されません。ロードが完了するまで、画面は前の画面(別のtableView)でロックされます。

もちろん、ビューが表示されるまでは読み込みが開始されないという問題があります。例:タブバーのボタンをクリックしてブログを開くと、ロードが開始されます(これは-vievDidAppear:にあります)。ロードが完了すると、画面が表示されます。これは変だけど、それはなぜそれが4.3ではなく5でそうするのだろうか?

最初のテーブルで-viewWillUnloadメソッドを使用する必要があります。読み込み画面を表示して適用しますか?つまり、読み込み画面が必要ないときに読み込み画面を読み込むと、常に読み込み画面が表示されます(1秒間のフラッシュ)。

(ロード画面では、私がイメージし、上にactivityIndi​​catorで開始UIImageViewを意味する)任意の入力のための

ありがとう!

+1

おそらくiOSの5の最適化のいくつかの種類あなたが遅延してviewDidAppearからロードを起動しようとしたので、あなたがviewDidAppear方法は終了させたことがありますか? '[self performSelector:@selector(loadData :) withObject:foo afterDelay:delay]' 0.0で試してみる前に、まずdelay = 0.1で試してみてください。 – Gabriel

+0

実際にiOS5にいくつかの変更がありました。ここには良いブログ記事があります:http://gamesfromwithin.com/view-controller-notification-changes-on-ios5 –

+1

ありがとう! iOS 5では、ViewDidLoadとViewDidAppearを別のスレッドで自動的に分離するように思われますが、以前のバージョンではそうではありません。私はGabrielがperformSelectorで言ったようにそれを解決しました。みんなありがとう! –

答えて

0

マークが指摘しているように、問題はバックグラウンドで実際に実行する必要がある長い操作を実行しながらメインスレッドをブロックすることに関連しています。 これを行うと、ロードを実行している間にメインスレッドをブロックしないので、viewDidAppear:が呼び出されたときは問題ありません。

これを解決して、バックグラウンドでの読み込み操作を実行してから、メインスレッドに戻り、読み込みインジケータを削除できます。あなたはGCDで簡単にそれを行うことができます。

- (void)viewDidAppear:(BOOL)animated 
{ 
    // ... 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
              (unsigned long)NULL), ^(void) { 
     // Perform your time consuming operation, eg. load your blog entry 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // remove the loading screen and set your blog's data to UI components 
     }); 
    }); 
} 
関連する問題