2011-12-21 18 views
0

アプリケーションがインターフェイスイベントに対して正しく応答しなくなる原因は何でしょうか?私が直面している1つの問題は、私のアプリがすべての種類のアニメーションをやめてしまうことです。たとえば、キーボードはアニメーション化されず、画面に表示されます。デバイスの回転はアニメーション化されず、アニメーションなしで回転します。 UIAlertViewは、アニメーションなしで表示および非表示を切り替えます。iPadアプリケーションがインターフェイスイベントに正しく応答しなくなる

私は、1秒あたりにいくつかのオブジェクトを作成し、解除する高性能アプリケーションを開発しています。私は可能な限り少ないメモリを使用しようとします。私が説明しているこの問題はメモリ警告によって先行されず、私は例外をキャッチしません(私はそれらのすべてをログに記録します)。

誰かが私に助言を与えることができれば、本当に感謝しています。

Obs:別のことが私は興味があります:私のアプリで、私はこの問題があるとき、uiviewのアニメーションは起こって停止します。しかし、CALayerのアニメーションは正常に実行されます。それについての説明はありますか?

答えて

1

メインスレッドをブロックしているような操作をしているかのように聞こえます。すべてのUIはメインスレッドで行われるため、そこで長い計算を行っている場合は、UIが応答を停止します。同期URLリクエストを行っていますか?ここでもメインスレッドがブロックされます。

あなたは、Appleの​​3210を見てみましょうGCDまたはNSOperations

のいずれかを使用してこれを行う...できるだけバックグラウンドスレッドに限り非UIコードを移動する必要があります。

NSThreadsにAppleのテイク...

* ...離れスレッドから移動すると、パフォーマンス(とあなたのコードの簡素化)、すべての場合に可能ではないかもしれないあなたが作るん場所で飛躍的に向上させることができますスイッチ。具体的には、ディスパッチキューやオペレーションキューの代わりにスレッドを使用すると、いくつかの利点があります。

  • それはあなたのアプリケーションは、アプリケーションのメモリ空間にスレッドスタックを格納するために支払うメモリのペナルティを低減します。
  • スレッドの作成と設定に必要なコードが削除されています。
  • これは、スレッドの作業を管理およびスケジュールするために必要なコードを排除します。
  • これは、書かなければならないコードを簡略化します。

NSThreadとNSOperationQueueのthis questionも参照してください。

+0

よろしくお願いいたします。私はデータストリーミングを処理するためにバックグラウンドで実行されるいくつかのスレッドを持っており、私はいくつかのWebサービスを呼び出します。私は非同期にWebサービスを実行し、ストリーミングはNSThreadを使用しています。 NSOperationsはNSThreadよりも優れたパフォーマンスを備えていますか?別のもの:メインスレッドがブロックされている場合、アプリケーションをフリーズしてはいけませんか?ここに私の問題を示すビデオのリンクがあります:[link] http://www.youtube.com/watch?v=eFOpPofnSnw&feature=youtu.be – Leonardo

+0

私は興味があります。私のアプリでは、この問題は、uiviewアニメーションが起こるのを止める。しかし、CALayerのアニメーションは正常に発生します。それについての説明はありますか? – Leonardo

0

おそらく長時間実行しているメインスレッドをブロックしている可能性があります。コードのどこかでポーリングやループしていますか?あなたがそうしなければならない場合、あなたはバックグラウンドスレッドでそれを行うことを確認してください。

0

CALayerトランスフォームのアップデートは、メインスレッドよりも優先度が高く、メインUIスレッドがブロックされていても表示されます。ただし、メインスレッドがブロックされている限り、UIの更新は行われません。メインオブジェクトをブロックしている間、UIオブジェクトは固定されます。

UIアニメーションをスムーズにしたい場合、アプリケーションはすべてのメインスレッド処理からUI実行ループに頻繁に戻る必要があります(毎秒少なくとも30回ですか?)。

+0

メインスレッドの処理とメインのメインスレッドの処理との違いは?私はこの種の区別をしたことはありません....あなたが1秒間に少なくとも30回言うと、それを制御することは可能ですか? – Leonardo

+0

iOSアプリケーションでは、メインスレッドもUIスレッドです。すばやく実行できないもの(数十mS)は、おそらく別のスレッドや非同期で実行する必要があります。 – hotpaw2

関連する問題