2009-04-06 25 views
2

私のiPhoneアプリケーションには、ロードに数秒かかるローカルのsqliteデータベースから大量のデータを取り出すタブがいくつかあります。ユーザーがタブに触れると、アプリケーションがまったく何もしていないかのように見えます。私はスピナーを表示するウィンドウを表示しようとしましたが、すぐに処理が行われるため表示されません。NSRunloopsと強制イベント処理

データを非同期にロードするためのいくつかのオプションがありますが、私はコミュニティをポーリングして、NSRunloopの別のサイクルを強制的にウィンドウに表示させることで潜在的な問題があるかどうかを確認します。 10ここに私のコードは次のようになります

... 1の規模で

[[ActivityIndicator sharedActivityIndicator] show]; 
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; 

どのように悪いあなたは、これはハック評価のでしょうか?

答えて

3

どこを評価するのか分かりませんが、私はそれをやりたいとは思わないと思います。システムのデフォルトrunloopを駄目にするのは悪い考えのようです。

私は良いアプローチだと思います。最も単純には、独立したプライベートメソッドで追加処理を入れて、その後、これを行うことです。

[[ActivityIndicator sharedActivityIndicator] show]; 
[self performSelector:@selector(processingMethod) withObject:nil afterDelay:0]; 

あなたのインジケーターが表示された後processingMethodは、実行ループの最後に呼び出されることになりますこと。うまく動作するはずです。

インジケータがアニメーション化されている場合、設定方法によっては、processingMethodの実行中にアニメーション表示されないことがあります。その場合、あなたはもう少し複雑であるかもしれない、バックグラウンドスレッドでprocessingMethodを実行したいと思います、またはその代わりにこれを行うのと同じくらい簡単かもしれません:あり

[self performSelectorInBackground:@selector(processingMethod) withObject:nil]; 

潜在的な合併症をその終わりにprocessingMethodでは、処理の結果を表示するときに、メソッドをメインスレッドに戻す必要があるかもしれません。

+0

を私はジャックに同意し、私はラウンジが彼の第二の答え「performSelectorInBackground」を探していると思います: 私は他の人があまりにも問題を抱えていることがわかりました。 – mobibob

1

私の経験では、iPhoneのイベント処理コードは再入可能ではありません。したがって、デフォルトモードでrunloopを実行している場合は、さまざまなクラッシュの準備が必要です。 - コールバックで

  1. http://lists.apple.com/archives/xcode-users/2009/Apr/msg00313.html
  2. http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/16246-trying-make-modal-dialog-using-nested-nsrunloop.html
+0

あなたは正しいですし、さらに、Appleのdocはスレッドが再入可能ではないと述べています。他のスレッドのデータにアクセスすべきではありません。コールバックと「データを渡す」が好ましいアプローチです。 – mobibob

+0

リエントラントはどういう意味ですか? – airpaulg

関連する問題