iPhoneアプリ内でのスリープの使用(特にUINavigationControllerを使用)
-
22-07-2019 - |
質問
iPhoneの開発はかなり始めましたが、最初のアプリをリリースする予定です(実行しているWebサイトに関連)。アプリには非常に大きなデータベースが必要であるため、最も一般的に使用されるデータのみをローカルに保存し、Webサイトが稼働しているデータベースからJSON Webサービス呼び出しを介して他のデータを取得することにしました。
シミュレーターを使用して(ライブDBにヒットして)OKを実行している間、Webサービス呼び出しに依存する検索は、電話で実行するときに期待していたよりも時間がかかりました。これらの呼び出しは、瞬時に行われるネイティブ検索と比較すると、非常に悪く見えます。相対的な差を減らすために、ネイティブ検索(Webサービスの検索では既に1つを使用しています)の偽のインタースティシャル(アクティビティインジケーターのあるページ)を配置したかったのですが、Navigation Controller sleep(n)。
とにかく、私のアプリの検索セクションは、tabControllerタブのあるnavControllerです。このようなコードを使用しようとする場合:
[[tabBarController.viewControllers objectAtIndex:0] pushViewController:(UIViewController *)waitingController animated:YES]; sleep(2);
ViewControllerをプッシュし、検索プロセスをシミュレートし続ける前にアプリが2秒間待機するという効果がある場合、プッシュは常にスリープが完了するのを待ってから実行することがわかります。
navControllerプッシュで他の奇妙な結果がいくつかありましたが、いくつかの場合、インタースティシャルとしてプッシュしたものがコンテンツ単位で所定の場所に残っているときに2つの個別のviewcontrollerのマッシングのように見えることを経験しましたプッシュしたいもののタイトルは残りの場所です。
私が責任を負うという根本的な理解の欠如があると確信しているので、ここで少しガイダンスを期待しています。
乾杯、
アラン。
解決
sleep(float)
はメインスレッドをブロックし、UIをフリーズさせます。代わりに、 -[NSObject performSelector:withObject:afterDelay:]
例:
[label performSelector:@selector(setText:) withObject:@"Delayed Hello World!" afterDelay:2.0f];
他のヒント
メインスレッドでスリープしないで、アーキテクチャを変更することを検討します-優れたユーザーエクスペリエンスではありません!
NSOperationを使用してWebサービスとのやり取りを制御する方法を検討してください。これにより、操作をキューに入れて、特定の順序または並列で実行できるようになります。
NSOperationは、堅牢なスレッド操作を提供する非常に簡単な方法です。また、途中で更新したいメインスレッドにコールバックすることもできます。
このアーキテクチャは、ユーザーインターフェイスをより良くするのに役立つと思いますが、操作を使用するように思考を再構成すると、他の多くの利点が得られるでしょう。
NB:NSOperationとNSOperationQueueを理解するのに数回かかりましたが、私が投資した時間は間違いなく価値がありました。