0
アプリケーション固有の情報:
com.oneorangetree.iphoneexampleは時間内に起動できませんでした
経過合計CPU時間(秒):3.500(ユーザー1.680、システム1.820)、17%CPU
経過アプリケーションCPU時間(秒):0.920、5%CPU

アプリが読み込まれると、viewDidLoadで多くの処理が実行されます。完了するまでに約30秒かかります。これをバックグラウンドスレッドなどに入れてアプリを高速化し、クラッシュを防ぐにはどうすればよいですか(読み込みに時間がかかりすぎたため)

4

2 に答える 2

1

はい、バックグラウンドスレッドを使用することもできますが、可能な場合は事前に計算(またはキャッシュ)して、読み込み時間がそれほど長くならないようにすることをお勧めします。コードの実行に非常に時間がかかるのはどのようなことですか?

于 2010-06-25T04:11:12.117 に答える
1

私は過去にNSOperation/NSOperationQueueを単純なスレッド化に使用しました。具体的にNSInvocationOperationは、しばらく時間がかかるメソッド呼び出しを非常に簡単にスピンし、NSOperationQueue実際にスレッド化することができます。スポーンする方法はスレッドセーフである必要がありますが、それは特に難しいことではありません。たとえば、またはメソッドでを作成しNSOperationQueue-initから-viewDidLoadNSInvocationOperationをキューに追加して、途中で送信することができます。

NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
NSInvocationOperation *lengthyTask = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(processAddresses) object:nil];
[opQueue addOperation:lengthyTask];
[lengthyTask release];

(特にデスクトップで)ちょっとクールなことの1つは、10.6(およびiOS 4)ではGrandCentralDispatchが自動的に使用されることです。

長いタスクをスレッド化すると、アプリの応答性が向上します(特に、結果を監視し、スレッド化されたタスクからの結果を表示する場合は、おそらくKVOを使用します)が、キャッシュを実装すると便利です。起動するたびにアドレス帳を再読み込みすると、非常にコストがかかります。特に、ほとんどの人はアドレス帳をあまり変更しません。計算されたデータをローカルファイルまたはデータベースに保存できます(コアデータの使用はそれほど難しくありません。速度が遅すぎる場合は、SQLiteを直接使用できます)。次に、起動時に、アドレス帳を調べて、アプリが最後に実行されたときからの各レコードの変更日を比較し、新しく変更されたレコードをジオコーディングできます。

于 2010-06-25T04:47:56.257 に答える