1

私はiPhone開発にかなり慣れていませんが、最初のアプリ(実行しているWebサイトに関連する)をリリースするところです。このアプリは非常に大規模なデータベースを必要とするため、最も一般的に使用されるデータのみをローカルに保存し、Webサイトが実行されているデータベースからJSONWebサービス呼び出しを介して他のデータを取得することにしました。

シミュレーターを使用してOKを実行している間(ライブDBをヒット)、Webサービス呼び出しに依存する検索は、電話で実行しているときに思っていたよりも時間がかかりました。これらの呼び出しは、瞬間的なネイティブ検索と比較すると、はるかに見栄えが悪くなります。相対的な違いを減らすために、ネイティブ検索(Webサービス検索ではすでに使用されている)に偽のインタースティシャル(アクティビティインジケーターのあるページ)を入れたかったのですが、ナビゲーションコントローラーのプッシュのタイミングに問題がありました。 sleep(n)。

とにかく、私のアプリの検索セクションは、tabControllerタブのあるnavControllerです。このようなコードを使おうとすると:

[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingControllerアニメーション:YES];
sleep(2);

ビューコントローラーがプッシュされ、アプリが2秒間待機してから検索プロセスのシミュレーションを続行する場合、プッシュは常にスリープが終了するのを待ってから実行します。

私はnavControllerプッシュで他の奇妙な結果をいくつか経験しました。いくつかの機会に、インタースティシャルとしてプッシュしたビューコントローラーがコンテンツごとに所定の位置に残り、押し込みたいものは残りの場所です。

私のせいにするのは根本的な理解の欠如であると確信しているので、ここで少しのガイダンスを期待しています。

乾杯、

アラン。

4

2 に答える 2

3

sleep(float)メインスレッドをブロックして、UIをフリーズさせます。代わりに、後で実行するアクションをスケジュールする必要があります。-[NSObject performSelector:withObject:afterDelay:]

例:

[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f];
于 2009-06-25T07:07:45.877 に答える
0

私はあなたのアーキテクチャを変更し、メインスレッドで眠らないようにすることを検討します-素晴らしいユーザーエクスペリエンスではありません!

NSOperationを使用してWebサービスとの対話を制御することを検討してください。これにより、操作をキューに入れて、特定の順序または並列で実行できるようになります。

NSOperationは、堅牢なスレッド操作を提供する非常に簡単な方法です。途中で実行したい更新を使用して、メインスレッドにコールバックすることを選択できます。

このアーキテクチャは、ユーザーインターフェイスを大幅に改善するのに役立つと思いますが、操作を使用するように考えを再構成すると、他にも多くの利点があります。

NB:NSOperationとNSOperationQueueを実際に理解するのに数回かかりましたが、投資した時間は間違いなく価値がありました。

于 2009-06-25T07:11:15.010 に答える