1

私のアプリの 1 つで、配列を含む多くの計算を行って、それらをグラフ化しています。計算にはユーザー入力が含まれます。ユーザーが異常な値を入力すると、アプリはメモリを大量に消費して終了するまで計算を実行し続けます。ユーザーがアプリを再度開こうとすると、最後に保存されたデータから同じ計算が試行され、再びクラッシュします。デフォルト値に戻すには、ユーザーがアプリを削除して再ダウンロードする必要があります。

この問題を解決するために、メモリ不足のためにアプリが強制終了されたときに、保存されたすべてのデータをダンプしたいと考えています。applicationDidReceiveMemoryWarning:appDelegate とdidReceiveMemoryWarning:、計算が行われている viewController に実装しようとしました。これらの関数はどちらも呼び出されていません。少し調べたところ、メインの実行ループをブロックしているためであることがわかりました。

この状況をどのように処理するのが最善でしょうか?

4

1 に答える 1

1

基本的に、メインの実行ループをブロックしてはいけません。ユーザー インターフェイスを(モーダル ロード画面などで) ブロックすることはできますが、メインの実行ループをブロックすると、あらゆる種類の問題に備えることになります。

作業をセカンダリ スレッドに移す方法はたくさんあります。最も簡単で最高レベルのオプションの 1 つは、 を使用することperformSelectorInBackground:です。より有限な制御が必要な場合はNSOperation、 andを使用するNSOperationQueueか、GCD まで使用できます (この低レベルを取得する必要がないことを願っています)。

作業をセカンダリ/バックグラウンド スレッドに置くもう 1 つの利点は、「キャンセル」ボタンを使用して、時間がかかりすぎると思われる場合にユーザーが操作をキャンセルできるようにすることです。ユーザーがこれをタップすると、実行中の操作をキャンセルして、これらのメモリ警告が最初に発生するのを回避できます。

ただし、UI の作業はすべてメイン スレッドで行う必要があることを忘れないでください。そのため、処理が完了したら、メイン スレッドで ( performSelectorOnMainThreadetc を使用して) グラフ自体を更新してください。

于 2013-03-01T10:00:55.800 に答える